3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

messageboxを閉じると、元のダイアログじゃないダイアログがアクティブになる話

Last updated at Posted at 2020-03-03

#なんでそうなる!#
他愛のないことなんだけど、ぜんぜん情報がなかったので記録

###事の始まりはごく普通の画面の開発###

いつもどおり
messageboxの共通クラスを入れて(同僚のPGから流用)
親(A)画面を作り、子(B)画面を作り、などなどなど
特に問題なく簡単に完成!

で、
###ちょいテストするか~###

子(B)画面で、入力、チェックNG、エラーメッセージ出た。クリック!
「ん?」
親(A)画面がアクティブに上がってきたぞ???

imeg.jpg

#なんでそうなる!#

何回やっても同じようになる。
開発環境がおかしいのか?

windows 10 visualstudio2017 WPF .NETframework 4.5.2
(ためしにvisualstudio2010でやっても同じ)

##問題のソース##

class Class1
{
    public static void errmsg(string text)
    {
        MessageBox.Show(text,"エラー",MessageBoxButton.OK,MessageBoxImage.Error,MessageBoxResult.OK,
            MessageBoxOptions.DefaultDesktopOnly);
    }
}

##何をやっても、そうなる##

何とかしようとして試してみました。

### .Active()を置いてみる###

ダメでした。
コールしてるイベントの後でAがアクティブ(画面のトップ)に来る感じ

### topmostではさんでみる ###

ダメ、ではないけれども、、、
topmostは確かにBがトップに居続けるので、見た目は問題ない
でも、アクティブはAが持っていっているので、見た目が、操作的にも問題アリ
(topmostは一番上に張り付くので、怖い)

### 共通モジュールじゃなく直接書く ###

これはOKだった。
でも、「共通化」したいのでNG
さらに、やっかいなパターンが
一回、直接書いたmessagebox.showをした後、
共通化したmessageboxだと、OK(子画面がActiveに)
(わけがわからん)

結局何が問題か&解決策 #

1.親からshowで子ダイアログを起動している
2.共通モジュールでmessagebox.showしている
3.MessageBoxOptions.DefaultDesktopOnlyをつけている
このような条件がそろうと発生。

なので
MessageBoxOptionsをつけないと発生しない。
ちなみに
ServiceNotificationでも発生するので
このオプションを省略するほうがいいかも
突っ込んで調べていないので、
「オプションをつけないことによる弊害」は調べていない

####以上(知らないソースを流用しなきゃよかった。。)####

3
1
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?