2014-04-28 2 views
7

ich aus dem Beispielprojekt arbeite hier: http://www.codeproject.com/Articles/8086/Extending-the-save-file-dialog-class-in-NETC# Anpassen von Steuerelementen in einem Speicherdialog - wie wird die Schaltfläche für den übergeordneten Ordner deaktiviert?

ich die Adresse/Standort Leiste am oberen Rand versteckt haben und andere Modifikationen gemacht, aber ich kann mich nicht für das Leben verwalten Sie die Taste deaktivieren, die Sie gehen können bis zum übergeordneten Ordner. Ist in der ToolbarWindow32-Klasse das Problem. Dies ist, was ich im Moment haben, aber es funktioniert nicht:

int parentFolderWindow = GetDlgItem(parent, 0x440); 

//Doesn't work 
//ShowWindow((IntPtr)parentFolderWindow, SW_HIDE); 

//40961 gathered from Spy++ watching messages when clicking on the control 
// doesn't work 
//SendMessage(parentFolderWindow, TB_ENABLEBUTTON, 40961, 0); 

// doesn't work 
//SendMessage(parentFolderWindow, TB_SETSTATE, 40961, 0); 

//Comes back as '{static}', am I working with the wrong control maybe? 
GetClassName((IntPtr)parentFolderWindow, lpClassName, (int)nLength); 

Alternativ kann, wenn sie auf die Schaltfläche übergeordneten Ordner verwenden und gehen, wohin ich will sie nicht, ich bin in der Lage auf die aussehen neues Verzeichnis, in dem sie landen, gibt es eine Möglichkeit, die Navigation zu zwingen, zurückzugehen?

Screenshot

Edit: Hinzugefügt Screenshot

+0

Haben Sie in [dieser Artikel] versucht, Blick (http://www.codeproject.com/Articles/19566/Extend-OpenFileDialog-and-SaveFileDialog-the-easy) – Icemanind

Antwort

1

ich nicht, dass dies funktionieren wird. Selbst wenn Sie die Schaltfläche deaktivieren, können sie ..\ eingeben und auf Speichern klicken und es wird eine Ebene höher. Sie können das Textfeld Dateiname nicht genau deaktivieren und die Funktionalität des Dialogfelds beibehalten.

Sie wären besser dran, indem Sie FolderBrowserDialog verwenden und die RootFolder-Eigenschaft festlegen und den Benutzer auffordern, den Dateinamen einzugeben oder automatisch zu generieren.

Wenn der Ordner, um die Benutzer beschränken wollen, sind, ist kein Environment.SpecialFolder Dann müssen Sie einige Arbeit zu tun, den Anruf zu SHBrowseForFolder manuell ILCreateFromPath mit, um eine PIDLIST_ABSOLUTE für Ihren Weg zu bekommen, um die BROWSEINFO zu passieren .pidlRoot

Sie können FolderBrowserDialog.RunDialog widerspiegeln, um zu sehen, wie dieser Aufruf ausgeführt wird.

+0

Sicherheit ist kein Problem, so dass jeder mit ".. \" wird dadurch nicht verwirrt. Ich kann keinen FolderBrowserDialog verwenden, weil er zum Speichern von Dateien in Cloud-Speicherdiensten wie Google Drive gedacht ist. Ich muss ihnen die Dateien zeigen, die sie dort bereits haben, damit sie nichts versehentlich überschreiben. Ich habe Angst, wenn sie ein paar Ordner tief in ihren Google Drive-Ordnern bekommen und den Ordner nach oben zu basteln beginnen, werden sie in den temporären Ordnerbereich springen. – Bryan

4

// Komm zurück, als '{static}', bin ich vielleicht mit der falschen Kontrolle zu arbeiten?

Sie wissen Sie die falsche Steuerung verwenden, erwartet Sie „ToolbarWindow32“ zurück zu sehen. Ein sehr bedeutendes Problem, wie es bei Codeproject.com Code häufig vorkommt, ist, dass dieser Code nicht mehr so ​​funktioniert wie gepostet. Windows hat sich seit 2004 zu sehr verändert. Vista war die erste Version seither, die einen komplett neuen Satz von Shell-Dialogen hinzufügte, die auf IFileDialog basieren. Viel verbessert gegenüber seinem Vorgänger, insbesondere Anpassung des Dialogs ist ein Los Reiniger durch die IFileDialogCustomize Schnittstelle. Nicht wirklich, was Sie tun möchten, und Anpassungen tun nicht gehören Basteln mit der Navigationsleiste.

Die IFileDialogEvents-Schnittstelle liefert Ereignisse. Das Ereignis, nach dem Sie suchen, ist das OnFolderChanging-Ereignis. Entwickelt, um den Benutzer davon abzuhalten, weg von dem aktuellen Ordner zu navigieren, die Sie wirklich wollen.

Während dies auf dem Papier gut aussieht, sollte ich Sie davor warnen, tatsächlich zu versuchen, diese Schnittstellen zu verwenden. Ein häufiges Problem mit allem, was mit der Windows-Shell zusammenhängt, ist, dass sie nur die Verwendung in C++ erleichtern. Die COM-Schnittstellen sind die "unfreundliche" Art, Schnittstellen basierend auf IUnknown ohne eine Typbibliothek, die Sie problemlos verwenden können, um einen Verweis auf Ihr C# - oder VB.NET-Projekt hinzuzufügen. Microsoft hat die "Vista-Bridge" veröffentlicht, um diese Schnittstellen auch für C# nutzbar zu machen, sie sieht like this aus. Ja, ja.Doppelter Fehler, wenn Sie feststellen, dass Sie dies zweimal tun müssen, funktioniert das nur bei späteren Windows-Versionen und es gibt einen starken Hinweis, dass Sie dies unter XP versuchen (basierend auf der Kontroll-ID, die Sie gefunden haben).

Dies ist einfach nicht etwas, das Sie unterstützen möchten. Da die Alternative so einfach ist, verwenden Sie stattdessen das unterstützte .NET FileOk-Ereignis. Ein WinForms Beispiel:

private void SaveButton_Click(object sender, EventArgs e) { 
     string requiredDir = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); 
     using (var dlg = new SaveFileDialog()) { 
      dlg.InitialDirectory = requiredDir; 
      dlg.FileOk += (s, cea) => { 
       string selectedDir = System.IO.Path.GetDirectoryName(dlg.FileName); 
       if (string.Compare(requiredDir, selectedDir, StringComparison.OrdinalIgnoreCase) != 0) { 
        string msg = string.Format("Sorry, you cannot save to this directory.\r\nPlease select '{0}' instead", requiredDir); 
        MessageBox.Show(msg, "Invalid folder selection"); 
        cea.Cancel = true; 
       } 
      }; 
      if (dlg.ShowDialog() == DialogResult.OK) { 
       // etc... 
      } 
     } 
    } 
+0

Danke für diese zusätzliche Information Hans, aber ich benutze den FileOK-Check bereits, um sicherzustellen, dass sie im richtigen Ordner gespeichert sind oder es Kinder sind. Ich habe auch schon die meiste Arbeit mit diesem Demo-Projekt gemacht (Entfernte Adressleiste und habe meine eigene OnFolderChange-Prüfung gemacht, so dass, wenn es über dem Ordner ist, den ich eingerichtet habe, das obige Fenster angezeigt wird). Also habe ich gehofft, das zu behalten und diese letzte Änderung zu machen – Bryan

1

Da Sie eine solche individuelle Verhalten wollen stattdessen niedrigen Level-Code zu entwickeln (dh wahrscheinlich yo Pause in den nächsten Versionen von Windows) Sie können versuchen, Ihre Dateiauswahl Form zu entwickeln.

Grundsätzlich ist es eine einfache Treeview + Listenansicht. Microsoft hat eine walk-through.

Es dauert einen halben Tag, aber sobald Sie Ihre benutzerdefinierte Form haben, können Sie alle Verhaltensweisen definieren, die Sie ohne Tricks und Grenzen benötigen.

+0

Oookii Dialoge könnte ein guter Ausgangspunkt sein – sam

Verwandte Themen