wpf messagebox.ownerをデスクトップウィンドウに設定する方法Splashscreenがメッセージボックスを閉じるため
-
05-09-2019 - |
質問
私はを使用しています スプラッシュスクリーン ビットマップを設定することにより、WPFの機能 アクションを構築します スプラッシュスクリーンに。スプラッシュ画面の後ろで、ライセンス情報がチェックされています。失敗した場合は メッセージボックス.
これによれば フィードバック, 、それはmessagebox.ownerがスプラッシュ画面であり、メッセージボックスであっても別のウィンドウが開くとすぐに、スプラッシュ画面ウィンドウが閉じてメッセージボックスを閉じるため、ユーザーはメッセージボックスを表示しません。
したがって、回避策はmessagebox.ownerを別のウィンドウに設定することですが、それは私が必要とさえしないかもしれない別のウィンドウをインスタンス化する必要があることを意味します。
MessageBox.ownerをデスクトップウィンドウに設定することは可能ですか?そして、どのように、頭に浮かぶ他の機能は getDeskTopWindow() API関数ですが、それはウィンドウハンドルとメッセージボックスを返します。所有者はWPFウィンドウです。
解決 3
問題を見つけました。また、これを引き起こすビルドインスプラッシュ画面も使用しています。 WPF SplashScreenはメッセージボックスを閉じます
他のヒント
モーダルダイアログの親としてデスクトップウィンドウを使用することは良い考えではないので、@Nirが彼の答えで指摘したように、ここに他の3つの回避策があります。
1)隠されたウィンドウを使用します。メッセージボックスまたは他のモーダルダイアログの親として機能する小さな非モーダルウィンドウを作成します。このアプローチについては、ここで説明します。
http://social.msdn.microsoft.com/forums/en-us/wpf/thread/116bcd83-93bf-42f3-9bfe-da9e7de37546/
2)非モーダルメッセージウィンドウを作成します。スタートアップモードを変更して明示的なシャットダウンに変更し、非モーダルウィンドウを使用してメッセージを表示します。このアプローチは、このStackoverFlowの質問に対する答えで説明されています。
wpf 4.0でスプラッシュ画面を使用すると、例外の詳細があるメッセージボックスがすぐに消えます
3)メッセージボックスを2回呼び出します。どうやら、問題は示されている最初のモーダルダイアログにのみ影響します。したがって、最初のオープニングとクロージングのフラッシュを気にしない場合、モーダルダイアログを2回コールするだけです。
個人的には、これらの回避策は好きではありません。他の唯一のオプションは、組み込みのスプラッシュスクリーン機能を回避し、ゼロから独自の機能を展開することです。そのルートをさらに調査したい場合は、これがリンクです。
http://social.msdn.microsoft.com/forums/en-us/wpf/thread/8dd49fd0-9cc9-43c6-b285-6f119ab8a32e/
最後に、あなたが私と同じようにこの問題にイライラしているなら、Microsoftに投票してこのバグを修正することができます。
私は自分でこの解決策を思いついたので、何か問題があるかもしれませんが、それは完全に機能しているようです:
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);
コードを投稿できますか?これを新しい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);
}
...そして、それは期待どおりに機能します(「確認の開始」プロンプトは、私が応答するまで開いたままで、「いいえ」をクリックすると、アプリがシャットダウンします)。
デスクトップウィンドウは決して正しい親ではありません。これを読んで、理由を知る:
http://blogs.msdn.com/oldnewthing/archive/2004/02/24/79212.aspx
この投稿で説明されている問題はあまり起こりません。MSがそれを回避したため、この投稿では次の方法を見ることができます。
http://blogs.msdn.com/oldnewthing/archive/2006/11/02/931674.aspx
これは私を大いに助けてくれました.....新しいアイデアを与えてくれましたが、ここで見た例のコードにはいくつかの変更が必要です
これがWPFの簡単な例です。これは機能しています
ボタンをクリックします
このコードを貼り付けます
if(system.windows.forms.messagebox.show( "are u sure"、 "delete"、system.windows.forms.messageboxbuttons.yesno、system.windows.forms.messageboxicon.question)== system.windows.forms。 dialogresult.yes){this.close(); } else {messagebox.show( "削除しないのはなぜ"); }
これはOPの状況に直接関係しているわけではありませんが、特定の特別な状況で他のウィンドウの後ろにメッセージボックスが隠されていることに問題を抱えている他の人にとっては有用かもしれません。
@dthrasherが言及しているように、1つの解決策は、隠されたダミーウィンドウを使用することです。しかし、時にはそれだけでは十分ではありません。解決策は、隠されたダミーウィンドウを使用するだけでなく、メッセージボックスで使用するたびにその最上位のプロパティをオンにするという状況がありました。
_formKludge.TopMost = true;
MessageBox.Show(_formKludge, "Nice informative message.", "Super-duper Program",
MessageBoxButtons.OK, MessageBoxIcon.Error);
_formKludge.TopMost = false;