質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

2回答

4806閲覧

messagebox.showの後、戻るダイアログが元のダイアログにならない

takataka75

総合スコア95

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2020/02/29 04:14

編集2020/03/02 13:50

前提・実現したいこと

エラーメッセージ用にmessageboxを共通クラスにしており、
ダイアログから表示させているのですが、
messageboxから戻ってくると
別のダイアログがアクティブ化されてしまいます。
キチンと呼び出したダイアログへアクティブを戻したいのですが
うまくいきません

環境
visualstudio 2017 C# WPF

発生している問題

動作の流れ
1.mainwindow(親ダイアログ)にてwindow1(子ダイアログ)をshow
2.window1にてmessageboxsクラスのMessageShowを呼ぶ
3.MessageShowにてMessageBox.Show(text);している
これで普通にメッセージボックスは表示されますが、
OKで戻ってくると
mainwindowがアクティブになり、
window1が隠れてしまいます。
window1がアクティブのままにしたいです。

該当のソースコード

mainWindow.xaml.cs

c#

1 2namespace WpfApp1 3{ 4 /// <summary> 5 /// MainWindow.xaml の相互作用ロジック 6 /// </summary> 7 public partial class MainWindow : Window 8 { 9 public MainWindow() 10 { 11 InitializeComponent(); 12 } 13 14 private void Button_Click(object sender, RoutedEventArgs e) 15 { 16 Window w = new Window1(); 17 w.Owner = this; 18 w.Title = "新しいWindowをShow"; 19 w.Show(); 20 } 21 } 22} 23

window1.xaml.cs

c#

1 2namespace WpfApp1 3{ 4 /// <summary> 5 /// Window1.xaml の相互作用ロジック 6 /// </summary> 7 public partial class Window1 : Window 8 { 9 public Window1() 10 { 11 InitializeComponent(); 12 } 13 14 private void Button_Click(object sender, RoutedEventArgs e) 15 { 16 string str = "A"; 17 18 MessageBoxs.MessageShow(str); 19// System.Windows.Forms.MessageBox.Show("a"); 20 } 21 22 private void Button_Click_1(object sender, RoutedEventArgs e) 23 { 24 System.Windows.MessageBox.Show("B"); 25 } 26 } 27} 28 29

messageboxs.cs

c#

1 2namespace WpfApp1 3{ 4 class MessageBoxs 5 { 6 public static void MessageShow(string text) 7 { 8 MessageBox.Show(text,"a",MessageBoxButton.OK,MessageBoxImage.Error,MessageBoxResult.OK, 9 MessageBoxOptions.DefaultDesktopOnly); 10 11 } 12 } 13} 14

試したこと

①一度、window1から(直に書いてある)messagebox.showした後だと、大丈夫
②windwo1.Acitve()を最後に加えてもダメだった。
③VisualStudio2019で作ってみると、問題なし(多分)
④VisualStudio2013で作ってみると、同じくおかしい(多分)
④topmostを使って、window1を固定ー>隠れなくなるがActiveはmainWindowになっているのでNG(操作ミスの原因になりかねないため)

補足情報

ソフト開発の都合で
「window1.show()でダイアログ表示する(showdialogではNG)」
「messageboxs.csを使ってメッセージボックスを表示する(window1に埋め込めない)」
「開発環境は2017と指定を受けている」
という制約があります。

解決策がありましたら、
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2020/02/29 06:20

Windows10(1903) + Visual Studio 2017(15.9.18) + .NET Framework 4.5を指定してプロジェクト作成 ... では再現しませんでした。(<Window1がアクティブになってフォーカスが戻る)
takataka75

2020/03/01 01:53

VS2017のWPFですが、そちらでは?
dodox86

2020/03/01 02:12

もちろん、WPFです。
takataka75

2020/03/02 00:25

おかしいですね。フレームワーク4.5.2です。別のマシンでやってみると、発生しなかったです。 環境回り、確認してみます
guest

回答2

0

自己解決

MessageBox.ShowのMessageBoxOptionsパラメータしだいで
問題の事象が発生する。
.DefaultDesktopOnly
.ServiceNotification
の2つだと、おかしくなる。
それ以外だと発生しない。

・オプションパラメータをつけない
・Nonにする
他に影響があるかもしれないが、
一応の解決策

投稿2020/03/02 14:30

takataka75

総合スコア95

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Window1 でMessageShowを呼んだあと、this.Topmost = trueで最前面にして、
即座にthis.Topmost = falseで前面に残ったままになりませんか?

** [追記] **
思い付きですが、非同期にしてみたらどうでしょう?

C#

1private async void Button_Click(object sender, RoutedEventArgs e) 2{ 3 string str = "A"; 4 5 await Task.Run(() => MessageBoxs.MessageShow(str)); 6}

投稿2020/02/29 05:10

編集2020/02/29 06:45
hihijiji

総合スコア4152

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takataka75

2020/02/29 05:17

試してみましたが、確かにウィンドウは隠れなくなりますが、アクティブはmainWindowになりました。アクティブでないので、操作ミスになりかねないのでNGでした。(すみません、書き抜かり、既に試しています)
takataka75

2020/02/29 05:29

hihijijiさんのパターンだと隠れたと思います。topmostの付け方はいくつかやりましたが、隠れてしまったり、隠れないけどアクティブは違う、の2パターンしかなかったです。
hihijiji

2020/02/29 05:31

Window.Activate メソッドが効かないのはOSの仕様変更のようです。 レジストリのForegroundLockTimeoutをいじったりは出来ない環境でしょうから 制約自体をOSの仕様に合わせて変更してもらうしかないのでは?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問