9
votes

C #, WPF - OpenFileDialog n'apparaît pas

J'ai cherché sur le Web et je ne suis malheureusement jamais tombé sur un problème aussi comme le mien, alors voici:

My C # WPF Application ne me montrera pas d'OpenFileDialogs ou de SafeFileDialogs. P>

bool? shown = ofd.ShowDialog();


3 commentaires

En tant que point de référence à ceux qui répondent, cela semble être Microsoft.win32.openfiledialog et non l'équivalent system.windows.forms.openfiledialog .


Oui, c'est vrai - merci pour la clarification!


C'est une question ancienne, mais je ressens le même phénomène avec un complément VSTo pour Excel: "Parfois, ça marche, parfois ce n'est pas le cas." Il est totalement imprévisible. Malheureusement, ni expérimenter des fils STA ni la création de formes (factices) ou des fenêtres WPF avant d'appeler OpenFiledialog.showdialog () (comme suggéré ci-dessous) empêche ce comportement.


7 Réponses :


9
votes

Il existe un grand nombre de modes de défaillance possibles pour OpenFileDialog. En utilisant One expose votre application sur n'importe quelle extension Shell installée sur votre machine. Beaucoup d'entre eux peuvent être très déstabilisants, ce n'est pas si probable que l'auteur d'extension a vérifié s'il fonctionne correctement dans un processus WPF.

Attaquez ce problème en exécutant l'utilitaire Autoruns de Sysinternals. Cliquez sur l'onglet Explorateur et recherchez les groupes qui ont «Shelex» dans leur nom. Décochez tout ce qui n'a été publié pas par Microsoft. Redémarrez et vérifiez si le problème est résolu.


1 commentaires

Merci pour le conseil! Malheureusement, comme vous l'avez souligné, il y a un grand nombre de modes de défaillance possibles et la désactivation de toutes les extensions de shell tiers n'était pas celle que j'ai rencontrée. Même après avoir tout retourné et redémarrer le problème persiste. Aussi, laissez-moi indiquer que les dialogues fonctionnent dans un autre projet en même temps - sans faille. J'aimerais vous voter, cependant, comme cela me semble assez utile. Malheureusement, je ne peux pas faire ça jusqu'à ce que j'ai rassemblé un peu plus de représentant: P



7
votes

Cela m'est arrivé récemment. Le problème était que la méthode principale code> n'a été marquée comme un stathread code> qui provoquera la méthode showdialog code> WPF OpenFileDialog '/ code> pour bloquer indéfiniment.

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


4 commentaires

En disant que cela vous bloquera pour dire que cela ne reviendra pas? Parce que ce n'est clairement pas ce qui se passe à ma fin. Au contraire, il retourne immédiatement, indiquant aucune boîte de dialogue n'a été affichée, mais cela ne fait que sur des occasions aléatoires.


Dans la demande de console, il est nécessaire d'avoir Stathread pour que la boîte de dialogue fonctionne.


Mais WPF est différent. Et le code semble être en cours d'exécution sur le fil principal également.


J'utilise Xna Game Studio au lieu de WPF et cela a résolu mon problème :).



0
votes

Je ne sais pas si vous l'avez compris ou non, mais j'ai récemment eu ce même problème. Dans mon cas, le problème était que ma demande n'avait pas créé une fenêtre existante.

Mon code a regardé quelque chose comme ça. P>

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


1 commentaires

Cela ne semble pas être le problème de mon application, que ce soit, car il est garanti d'avoir une fenêtre établie lors de la création de la boîte de dialogue. L'utilisateur doit cliquer sur un bouton pour le faire apparaître, de sorte qu'il a une fenêtre. Ou avez-je mal compris votre réponse?



0
votes

Dans l'application de la console, vous aurez besoin d'un appartement Stathread pour que cela fonctionne. Mais WPF est différent.

Je vous conseillerais d'utiliser les boîtes de dialogue de fichiers qu'après la démarrage de la fenêtre et le fil principal commence à fonctionner. Essayez de montrer votre boîte de dialogue dans certains événements Mainwindow de son cycle de vie.


0 commentaires

3
votes

Je ressens un problème similaire et que Garrett a suggéré, c'est un problème de STA. J'ai beaucoup de difficulté avec des problèmes de STA au cours des derniers mois, car je dois lancer des écrans à partir d'une fenêtre de console (objectifs de test) - cela signifie que le fil d'appel n'est pas STA, mais peut être simulé dans quelque chose comme ce qui suit: XXX

Illicité, il n'a pas fonctionné pour moi pour marquer la méthode de Stathread, je devais lancer l'opération dans un fil marqué comme STA.


1 commentaires

C'est exactement ce qui m'a aidé, merci! Et oui, juste pour marquer la méthode avec la propriété Stathread n'était pas suffisant.



1
votes

Je sais que cette question a été posée en 2010 et la réponse directe n'était pas celle que je vais fournir, mais comme aujourd'hui, il existe une autre raison d'avoir ce problème.

J'ai récemment installé mon logiciel sur une machine virtuelle fraîche qui fonctionne parfaitement sur mon ordinateur de développement et de nombreuses autres machines d'essai.

La machine virtuelle Windows 7 était trop fraîche et n'a pas eu la SP1 KB976932 installée.

Une fois installé, je pourrais utiliser les boîtes de dialogue de fichiers ouverts Sand Enregistrer.

J'espère que cela aidera quelqu'un d'autre.


0 commentaires

1
votes

parfois [stambread] ne fonctionne pas, vous pouvez essayer ceci: xxx


0 commentaires