2010-02-04 5 views
8

Ich habe die Suche nach oben und unten der Bahn und leider kam nie ganz über ein Thema wie meine, geht so hier:C#, WPF - Openfile nicht angezeigt

Meine C# WPF-Anwendung wird mir nicht keine OpenFileDialogs zeigen oder SafeFileDialogs.

private void btnBrowseNet_Click(object sender, RoutedEventArgs e) 
    { 
     OpenFileDialog ofd = new OpenFileDialog(); 
     ofd.CheckPathExists = true; 
     ofd.Multiselect = false; 
     ofd.Title = "Open Network Configuration Batch file..."; 
     ofd.ValidateNames = true; 
     ofd.Filter = "Comma Seperated Value Files|*.csv"; 

     if (ofd.ShowDialog() == true) 
     { 
      //... 
     } 
    } 

Diese exakte Code tut in einer Gelegenheit genau das, was es soll, und kaum fünf Minuten später tun kann ich auf die Schaltfläche alles, was ich will, passiert nichts, aber der Mauszeiger in einen kleinen Besetztanzeige drehen und dann nichts. Ich kann durch die Methode Schritt oder etwas tun, wie dieses

bool? shown = ofd.ShowDialog(); 

Aber egal was, wird der Dialog nicht mehr anzeigen. Natürlich wird in diesem Fall gezeigt, dass es falsch ist. Ich habe anderthalb Stunden damit verbracht, gestern und rechts zu suchen, als ich aufhörte. Ich versuchte es noch einmal und plötzlich funktionierte es. Manchmal funktioniert es, manchmal nicht. Aber es scheint projektspezifisch zu sein, weil ich denselben Code in ein neues Projekt einfügen kann und es so funktioniert, wie es soll. Das ist auch das Einzige an dem Projekt, das fischig wirkt. Alles andere funktioniert wie vorgesehen.

Hat jemand hier jemals etwas Ähnliches erlebt und somit eine Idee von dem, was ich tun könnte? Jede Hilfe könnte sehr geschätzt werden.

+4

Als Bezugspunkt zu diesen Antworten scheint dies "Microsoft.Win32.OpenFileDialog" und nicht das äquivalente "System.Windows.Forms.OpenFileDialog" zu sein. –

+0

Ja, das stimmt - Danke für die Klarstellung! – Koarl

+0

Es ist eine alte Frage, aber ich habe das gleiche Phänomen mit einem VSTO-Add-in für Excel: "Manchmal funktioniert es, manchmal nicht." Es ist völlig unvorhersehbar. Leider verhindert weder das Experimentieren mit STA-Threads noch das Erstellen von (Dummy-) Formularen oder WPF-Fenstern vor dem Aufruf von OpenFileDialog.ShowDialog() (wie unten vorgeschlagen) dieses Verhalten. – bovender

Antwort

7

Es gibt eine große Anzahl von möglichen Fehlermodi für OpenFileDialog. Wenn Sie eine Anwendung verwenden, wird Ihre App fast jeder Shell-Erweiterung zugänglich gemacht, die auf Ihrem Computer installiert ist. Viele davon können sehr destabilisierend sein. Es ist nicht so wahrscheinlich, dass der Autor der Erweiterung überprüft hat, ob er in einem WPF-Prozess ordnungsgemäß funktioniert.

Beheben Sie dieses Problem, indem Sie das AutoRuns-Dienstprogramm von SysInternals ausführen. Klicken Sie auf die Registerkarte Explorer, und suchen Sie nach den Gruppen, deren Name "ShellEx" enthält. Deaktivieren Sie alles, was nicht von Microsoft veröffentlicht wurde. Starten Sie neu und prüfen Sie, ob das Problem gelöst ist.

+0

Danke für den Hinweis! Leider, wie Sie darauf hingewiesen haben, gibt es eine große Anzahl von möglichen Fehlermodi und die Deaktivierung aller Shell-Erweiterungen von Drittanbietern war nicht die, auf die ich gestoßen bin. Auch nach dem Ausschalten und Neustarten bleibt das Problem bestehen. Lassen Sie mich auch darauf hinweisen, dass die Dialoge in einem anderen Projekt zur gleichen Zeit funktionieren - einwandfrei. Ich würde gerne stimmen Sie antworten, obwohl, wie es scheint ziemlich nützlich für mich. Leider kann ich das nicht tun, bis ich einige mehr rep gesammelt habe: P – Koarl

6

Das ist mir vor kurzem passiert. Das Problem war, dass die Methode Main nicht als STAThread markiert wurde, wodurch die Methode WPF OpenFileDialog ShowDialog auf unbestimmte Zeit blockiert wird.

static void Main(string[] args) 
{ 
    var openFileDialog = new OpenFileDialog(); 
    var result = openFileDialog.ShowDialog(); 
} 

wird nie Ausfahrt oder eine Ausnahme auslösen, während

[STAThread]  
static void Main(string[] args) 
{ 
    var openFileDialog = new OpenFileDialog(); 
    var result = openFileDialog.ShowDialog(); 
} 

wird wie erwartet.

+0

Mit der Aussage, es wird blockieren Sie meinen, es wird nicht zurückkehren? Weil das ist eindeutig nicht das, was passiert an meinem Ende. Im Gegenteil, es kehrt sofort zurück und zeigt an, dass kein Dialog angezeigt wurde, aber nur gelegentlich. – Koarl

+0

In der Konsolenanwendung ist STAThread erforderlich, damit der Dialog funktioniert. –

+0

Aber WPF ist anders. Und der Code scheint auch auf dem Hauptthread zu laufen. –

0

Nicht sicher, ob Sie es herausgefunden haben oder nicht, aber ich hatte kürzlich das gleiche Problem. In meinem Fall bestand das Problem darin, dass meine Anwendung kein vorhandenes Fenster eingerichtet hatte.

Mein Code sah in etwa so aus.

private void Application_Startup(object sender, StartupEventArgs e) { 
    string startupFileName = String.Empty(); 
    if (startupMode = StartupMode.Load) { 
     // open existing file 
     OpenFileDialog openDlg = new OpenFileDialog(); 
     if (openDlg.ShowDialog() != true) 
      return; 
     startupFileName = openDlg.FileName; 
    } else { 
     // create a new file 
     SaveFileDialog saveDlg = new SaveFileDialog(); 
     if (saveDlg.ShowDialog() != true) 
      return; 
     startupFileName = saveDlg.FileName; 
    } 

    // show my main application window 
    MainWindow myMainWindow = new MainWindow(startupFileName); 
    myMainWindow.Show(); 
} 

Die Openfile (oder Savefiledialog) würde sofort falsch zurück, ohne zeigt, weil meine Anwendung kein Fenster für sie hatte sich zu befestigen.

Meine Lösung war, den Open/Save-Code nach dem Erstellen meines Hauptfensters zu setzen, aber bevor ich die Show() -Methode aufgerufen habe.

+0

Das scheint nicht das Problem mit meiner Anwendung zu sein, da garantiert wird, dass ein Fenster bei der Erstellung des Dialogs eingerichtet wird. Der Benutzer muss auf eine Schaltfläche klicken, damit er angezeigt wird, also ** muss ** ein Fenster sein. Oder habe ich deine Antwort falsch verstanden? – Koarl

0

In der Konsolenanwendung benötigen Sie STAThread-Wohnung, damit es funktioniert. Aber WPF ist anders.

Ich würde Ihnen raten, die Datei-Dialoge nur zu verwenden, nachdem das Fenster startet und der Haupt-Thread zu arbeiten beginnt. Versuchen Sie, Ihren Dialog in einem MainWindow-Ereignis seines Lebenszyklus anzuzeigen.

1

Ich habe ein ähnliches Problem, und wie Garrett vorgeschlagen hat, handelt es sich um ein STA-Problem. Ich habe in den letzten Monaten viel mit STA-Problemen zu kämpfen gehabt, da ich Bildschirme von einem Konsolenfenster starten muss (Testzwecke) - das bedeutet, dass der aufrufende Thread nicht STA ist, aber in etwa wie folgt simuliert werden kann:

[STAThread] 
    private void Execute() { 
     try { 
      Thread t = new Thread(() => { 
       OpenFileDialog dlg = new OpenFileDialog(); 
       // The following would not return the dialog if the current 
       // thread is not STA 
       var result = dlg.ShowDialog(); 
      }); 

      t.SetApartmentState(ApartmentState.STA); 
      t.Start(); 
     } catch (Exception ex) { 
      // Handle the exception 
      ex.LogException(); 
     } 
    } 

Unforunately, es hat nicht funktioniert für mich nur die Methode als STAThread markieren, ich die Operation in einem Thread als STA markiert gestartet hatte.

+0

Genau das hat mir geholfen, danke! Und ja, nur um die Methode mit STAThread-Eigenschaft zu markieren, war nicht genug. – user2134488

1

Ich weiß, dass diese Frage im Jahr 2010 gestellt wurde und die direkte Antwort war nicht die, die ich liefern werde, aber als das heutige Datum gibt es einen anderen Grund, dieses Problem zu haben.

Ich habe meine Software kürzlich auf einer neuen virtuellen Maschine installiert, die perfekt auf meinem Entwicklungscomputer und vielen anderen Testmaschinen funktioniert.

Die Windows 7 virtuelle Maschine war zu frisch und nicht die SP1 KB976932 installiert hat.

Einmal installiert, könnte ich die Open Sand Speichern Dateidialoge verwenden.

Ich hoffe, dass dies jemand anderem helfen wird.

Verwandte Themen