13

ビットマップのBuild Actionを Splashscreenに設定して、WPF のSplashScreen機能を使用しています。スプラッシュ スクリーンの背後でライセンス情報がチェックされ、失敗した場合はMessageBoxが表示されます。

このFeedbackによると、それは MessageBox.Owner がスプラッシュ スクリーンであり、MessageBox であっても別のウィンドウが開くとすぐにスプラッシュ スクリーン ウィンドウが閉じられ、MessageBox が閉じられるためです。メッセージボックス。

したがって、回避策は MessageBox.Owner を別のウィンドウに設定することですが、それは必要ではない別のウィンドウをインスタンス化する必要があることを意味します。

MessageBox.Owner をデスクトップ ウィンドウに設定することは可能でしょうか? そして、頭に浮かぶ唯一の他の関数はGetDesktopWindow() api 関数ですが、それはウィンドウ ハンドルを返し、MessageBox.Owner は WPF ウィンドウです。

4

8 に答える 8

11

デスクトップウィンドウをモーダルダイアログの親として使用することはお勧めできないため、@Nir が回答で指摘したように、他の 3 つの回避策があります。

1) 非表示のウィンドウを使用します。MessageBox またはその他のモーダル ダイアログの親として機能する小さな非モーダル ウィンドウを作成します。このアプローチについては、次で説明します。

http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/116bcd83-93bf-42f3-9bfe-da9e7de37546/

2) 非モーダル メッセージ ウィンドウを作成します。起動モードを明示的なシャットダウンに変更し、非モーダル ウィンドウを使用してメッセージを表示します。このアプローチは、この StackOverflow の質問に対する回答で説明されています。

WPF 4.0 でスプラッシュ スクリーンを使用すると、例外の詳細を含むメッセージ ボックスがすぐに消える

3) MessageBox を 2 回呼び出します。どうやら、問題は表示された最初のモーダル ダイアログにのみ影響します。したがって、モーダル ダイアログを 2 回呼び出すだけで済みます。

https://connect.microsoft.com/VisualStudio/feedback/details/600197/wpf-splash-screen-dismisses-dialog-box

個人的には、これらの回避策は好きではありません。他の唯一のオプションは、組み込みの SplashScreen 機能を回避し、独自のものを最初から作成することです。そのルートをさらに調査したい場合は、次のリンクを参照してください。

http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/8dd49fd0-9cc9-43c6-b285-6f119ab8a32e/

最後に、私と同じようにこの問題に悩まされている場合は、Microsoft にこのバグを修正するように投票してください。

http://connect.microsoft.com/VisualStudio/feedback/details/600197/wpf-splash-screen-dismisses-dialog-box

于 2011-03-16T16:40:13.297 に答える
9

私は自分でこの解決策を思いついたので、何か問題があるかもしれませんが、完全に機能しているようです:

Window temp = new Window() { Visibility=Visibility.Hidden };
temp.Show();
MessageBox.Show(temp, "An error occurred before the application could start.\n\nTechnical Details: " + ex.Message, "Fatal Error", MessageBoxButton.OK, MessageBoxImage.Stop);
App.Current.Shutdown(1);
于 2012-06-01T17:08:04.460 に答える
3

問題が見つかりました。私はまた、これを引き起こす組み込みのスプラッシュ画面を使用しています: WPF SplashScreen は MessageBox を閉じます

于 2009-02-23T04:27:52.663 に答える
1

コードを投稿できますか?これを新しい WPF アプリケーションの App.xaml.cs ファイルに追加しようとしました。

protected override void OnStartup(StartupEventArgs e)
{
    if (MessageBox.Show("Start app?", "Confirm Start", 
        MessageBoxButton.YesNo) == MessageBoxResult.No)
    {
        this.Shutdown();
        return;
    }

    this.StartupUri = new Uri("Window1.xaml", UriKind.Relative);
    base.OnStartup(e);
}

...そして期待どおりに動作します(「開始の確認」プロンプトは、応答するまで開いたままになり、「いいえ」をクリックするとアプリがシャットダウンします)。

于 2009-02-23T04:20:52.587 に答える
0

デスクトップ ウィンドウは決して正しい親ではありません。理由については、以下をお読みください。

http://blogs.msdn.com/oldnewthing/archive/2004/02/24/79212.aspx

この投稿で説明されている問題は、MS が回避したため、あまり発生しません。この投稿では、次の方法を確認できます。

http://blogs.msdn.com/oldnewthing/archive/2006/11/02/931674.aspx

于 2009-02-24T15:38:05.090 に答える
-1

これは私を大いに助けてくれました.....新しいアイデアが与えられましたが、ここで見たサンプルコードにはいくつかの変更が必要です

これは wpf の簡単な例で、現在は動作しています

ボタンクリックで

このコードを貼り付けます

if (System.Windows.Forms.MessageBox.Show("よろしいですか", "削除", System.Windows.Forms.MessageBoxButtons.YesNo, System.Windows.Forms.MessageBoxIcon.Question) == System.Windows.Forms. DialogResult.Yes) { this.Close(); } else { MessageBox.Show("削除しない理由"); }

于 2009-07-15T10:45:08.003 に答える
-1

これは OP の状況とは直接関係ありませんが、特定の特別な状況で MessageBox が他のウィンドウの後ろに隠れてしまうという問題を抱えている他の人にとっては役立つかもしれません。

@dthrasher が言及しているように、1 つの解決策は非表示のダミー ウィンドウを使用することです。しかし、それだけでは不十分な場合もあります。非表示のダミー ウィンドウを使用するだけでなく、MessageBox でそれを使用するたびにその TopMost プロパティをオンにすることが解決策であるという状況がありました。

     _formKludge.TopMost = true;

     MessageBox.Show(_formKludge, "Nice informative message.", "Super-duper Program",
                     MessageBoxButtons.OK, MessageBoxIcon.Error);

     _formKludge.TopMost = false;
于 2014-03-22T14:05:20.463 に答える