2010-02-04 14 views
8

Sono stato alla ricerca su e giù per il web e, purtroppo, non sono imbattuto in un problema piuttosto come il mio, quindi ecco qui:C#, WPF - OpenFileDialog non appare

mio C# applicazione WPF non mi mostrerà nessun OpenFileDialogs o 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) 
     { 
      //... 
     } 
    } 

Questo codice esatto fa in un'occasione esattamente quello che deve fare e difficilmente cinque minuti dopo che posso fare clic sul pulsante tutto quello che voglio, non succede nulla ma il puntatore del mouse si trasforma in un po 'occupato-indicatore e poi Niente. Posso seguire il metodo o fare qualcosa di simile

bool? shown = ofd.ShowDialog(); 

Ma non importa quale, la finestra di dialogo non mostrerà. Ovviamente, mostrato sarà falso in quel caso. Ho sprecato un'ora e mezza a cercare ieri e proprio quando ho smesso ho provato di nuovo e all'improvviso ha funzionato. A volte funziona, a volte no. Ma sembra essere specifico del progetto perché posso incollare lo stesso codice in un nuovo progetto e funziona come dovrebbe. Inoltre, questa è l'unica cosa sul progetto che sembra strano. Tutto il resto funziona come previsto.

Qualcuno qui ha mai sperimentato qualcosa di simile e quindi un'idea di cosa potrei fare sulla terra? Qualsiasi aiuto potrebbe essere molto apprezzato.

+4

Come punto di riferimento per coloro che rispondono, questo sembra essere 'Microsoft.Win32.OpenFileDialog' e non l'equivalente' System.Windows.Forms.OpenFileDialog'. –

+0

Sì, è vero- Grazie per il chiarimento! – Koarl

+0

È una vecchia domanda, ma sto riscontrando lo stesso fenomeno con un componente aggiuntivo VSTO per Excel: "A volte funziona, a volte no." È totalmente imprevedibile. Sfortunatamente, né la sperimentazione con i thread STA né la creazione di form (fittizi) o finestre WPF prima di chiamare OpenFileDialog.ShowDialog() (come suggerito di seguito) impedisce questo comportamento. – bovender

risposta

7

Esistono numerose modalità di errore possibili per OpenFileDialog. Usando uno si espone la tua app praticamente a qualsiasi estensione della shell installata sul tuo computer. Molti dei quali possono essere molto destabilizzanti, non è probabile che l'autore dell'estensione abbia verificato se funziona correttamente in un processo WPF.

Affrontare questo problema eseguendo l'utilità AutoRuns di SysInternals. Fare clic sulla scheda Explorer e cercare i gruppi che hanno "ShellEx" nel loro nome. Deseleziona tutto ciò che non è stato pubblicato da Microsoft. Riavvia e controlla se il problema è risolto.

+0

Grazie per il consiglio! Purtroppo, come hai sottolineato, esiste un gran numero di possibili modi di errore e disabilitare tutte le estensioni della shell di terze parti non era quella che ho incontrato. Anche dopo aver spento tutto e riavviato il problema persiste. Inoltre, vorrei sottolineare che le finestre di dialogo funzionano contemporaneamente in un altro progetto, in modo impeccabile. Mi piacerebbe votare la risposta, però, dato che mi sembra abbastanza utile. Purtroppo non posso farlo fino a quando non ho raccolto un altro rappresentante: P – Koarl

6

Questo mi è successo di recente. Il problema era che il metodo Main non era contrassegnato come STAThread, il che causerebbe il blocco del metodo ShowDialog di WPF OpenFileDialog a tempo indeterminato.

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

sarà mai uscita o un'eccezione, mentre

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

funzionerà come previsto.

+0

Dicendo che bloccherete significa che non tornerà? Perché chiaramente non è quello che sta succedendo alla mia fine. Al contrario, restituisce immediatamente, indicando che non è stata visualizzata alcuna finestra di dialogo, ma solo in occasioni casuali. – Koarl

+0

Nell'applicazione Console è necessario che STAThread funzioni correttamente. –

+0

Ma WPF è diverso. E il codice sembra essere in esecuzione anche sul thread principale. –

0

Non so se l'hai capito o no, ma di recente ho avuto lo stesso problema. Nel mio caso, il problema era che la mia applicazione non aveva stabilito una finestra esistente.

Il mio codice era simile a questo.

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(); 
} 

L'OpenFileDialog (o SaveFileDialog) sarebbero immediatamente return false senza mostrare perché la mia domanda non aveva finestre per poter attaccarsi a.

La mia soluzione era quella di inserire il codice di apertura/salvataggio dopo aver creato la mia finestra principale, ma prima ho chiamato il metodo Show().

+0

Questo non sembra essere il problema con la mia applicazione in quanto è garantito avere una finestra stabilita sulla creazione della finestra di dialogo. L'utente deve fare clic su un pulsante per farlo apparire, quindi ** ha ** di essere una finestra. O ho frainteso la tua risposta? – Koarl

0

Nell'applicazione console è necessario disporre di STAThread app per farlo funzionare. Ma WPF è diverso.

Si consiglia di utilizzare le finestre di dialogo dei file solo dopo l'avvio della finestra e il thread principale inizia a funzionare. Prova a mostrare la finestra di dialogo in qualche evento MainWindow del suo ciclo di vita.

1

Sto riscontrando un problema simile e, come suggerito da Garrett, si tratta di un problema STA. Ho sofferto molto con i problemi STA negli ultimi mesi, poiché ho bisogno di avviare schermate da una finestra della console (scopi di test) - ciò significa che il thread chiamante non è STA, ma può essere simulato in qualcosa di simile al seguente:

[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, non ha funzionato per me basta contrassegnare il metodo come STAThread, ho dovuto avviare l'operazione in un thread contrassegnato come STA.

+0

Questo è esattamente ciò che mi ha aiutato, grazie! E sì, solo per contrassegnare il metodo con la proprietà di STAThread non era abbastanza. – user2134488

1

So che questa domanda è stata posta nel 2010 e la risposta diretta non è stata quella che fornirò, ma come data di oggi c'è un altro motivo per avere questo problema.

Ho installato il mio software su una macchina virtuale nuova che funziona perfettamente sul mio computer di sviluppo e su molte altre macchine di test.

La macchina virtuale Windows 7 era troppo fresco e non ha avuto il KB976932 SP1 installato.

Una volta installato, è possibile utilizzare le finestre di dialogo di salvataggio del file di sabbia aperta.

Spero che questo aiuti qualcun altro.