2

wpfで表示しようとしましfolderbrowserdialogたが、この例外が発生しました

OLE 呼び出しを行う前に、現在のスレッドをシングル スレッド アパートメント (STA) モードに設定する必要があります。Main 関数に STAThreadAttribute がマークされていることを確認します。この例外は、デバッガーがプロセスに接続されている場合にのみ発生します

この関数の前に [STAThread] を追加しようとしましたが、この例外を解決するにはどうすればよいですか?

機能は次のとおりです。

private void Save_any_File()
        {
            System.Windows.Forms.FolderBrowserDialog get_location = new System.Windows.Forms.FolderBrowserDialog();
            get_location.ShowDialog();
        }
4

2 に答える 2

1

Main()関数にはすでに[STAThread]属性があり、WPFの自動生成されたコードに埋め込まれています。Main()メソッド以外には何の効果もありません。これにより、WPFアプリのメインスレッド(別名UIスレッド)が「シングルスレッドアパートメント」を作成することが保証されます。これは、アプリ内のコードが実行を開始する前に、CLRによって実行されます。

STAはUIスレッドの厳しい要件であり、多くのCOMコンポーネントがそれを必要とします。STAは、スレッドセーフではないソフトウェアの安全なホームを提供します。したがって、「シングルスレッド」です。OpenFileDialogはそのようなコンポーネントの1つであり、その他はクリップボードとドラッグアンドドロップのサポートです。

そして、アプリ内でホームを見つけようとする多くのCOMコンポーネント。OpenFileDialogの場合、これらはフォルダービューの外観をカスタマイズするシェル拡張機能です。

簡単に言えば、問題は、ワーカースレッドでダイアログを表示しようとしていることは間違いありません。できません。Dispatcher.BeginInvoke()を使用して、UIスレッドへの呼び出しをマーシャリングします。

于 2011-07-08T23:18:38.903 に答える
0

この投稿は役立つかもしれません。これはWindowsフォームダイアログです。通常、WindowsFormHostまたはその他の相互運用メソッドが必要です。

于 2011-07-08T23:21:51.117 に答える