🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

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

WPF

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

Q&A

解決済

1回答

4525閲覧

WPF でWindowを次々追加して、すべてが閉じられていなければ警告を出す

FacePanel

総合スコア48

C#

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

WPF

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

0グッド

0クリップ

投稿2019/12/19 12:04

C#初心者です。
WPF でWindowを次々追加して、すべてが閉じられていなければ警告を出すということを実現したいと思っています。

じつは、Windowを追加する際に、番号を渡す方法を試してみました。
方法は
https://docs.microsoft.com/ja-jp/dotnet/api/system.collections.generic.list-1?redirectedfrom=MSDN&view=netframework-4.8
を使ってひらくWindowにそれぞれ番号をつけるというものでしたが、それぞれのWindowに番号を与えても、それをそれぞれのWindowと捉えることができずに、その先に行きませんでした。
それぞれのwindowに番号を与えても、それに基づいて、特定のWinbdowを指し示すことができなかったのです(つたない説明で申し訳ありません)。

新しくWindowを作る際に、そのWindowに番号をつけて、すべての追加Windowが閉じられているかを確かめるなどの方法があると思いますが、具体的に、どんな方法を採るべきでしょうか。簡単な方法を探しています。
Sampleなどをいただけると助かります。
どうぞよろしくお願い致します。

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

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

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

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

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

Zuishin

2019/12/19 12:27

Dictionary<int, Window> に入れてみたらどうでしょうか。
FacePanel

2019/12/19 12:33

ごめんなさい。 Dictionary<int, Window>でのやり方がいまいち、分かりません。 Sampleをいただけると助かるのですが。 でも、自分でも頑張っていますが。
TN8001

2024/11/02 08:41 編集

https://teratail.com/questions/225143 のような、どれがメインというのがないような作りってことでしょうか?(作り自体が特殊というかあまり見ない作りです) List<Window>を持っているのは誰なんでしょうか? WindowAがWindowBを開いたらWindowAが管理する? でもWindowAが先に閉じることもあるんですよね?? アプリが終わるまで確実に存在し、かつひとつだけのもの Appクラスに持たせれば解決できそうに思いますが、ちょっと状況が見えないので何とも言えません。 Windowがどう出るかの大雑把なコードとかは出せませんか?(各Window内部の処理はなくていいので)
Zuishin

2019/12/19 13:17

この質問に書いてある条件を満たすサンプルを出しても、実際の条件を満たさなければ役に立ちません。もう少し詳しく書いてください。私の想像する範囲では次のような仕様だと思いました。 あらかじめウィンドウが一つ開いている。 そのウィンドウで何か操作をすると、別のウィンドウが開く。 開くウィンドウは何種類かあるが、ある一つのウィンドウだけは最初のウィンドウ以外のウィンドウが開いていたら開くことができず、警告メッセージが出る。
FacePanel

2019/12/19 23:13

詳細が告げておらず、分かりにくくてすみません。 親Windowは、1つです。Zuishinさんのおっしゃる感じです。 親Windowの追加ボタンで、Windowが開きますが、子Windowの追加ボタンでも孫Windowが開きます。 また、親Windowの追加ボタンで、弟Windowも開きます。彼からも孫Windowが開きます。 ですが、親Windowは、すべての子供たちWindowが閉じないと閉じられなくしたいのです。 このため、付番がいいかなと思いました。
Zuishin

2019/12/19 23:20

App.Current.Windows.Count で現在開いているウィンドウの数がわかります。これが 2 以上であった場合、閉じるのを中止すればいいのではないでしょうか。中止するには親ウィンドウの Closing イベントで e.Cancel を true にします。
FacePanel

2019/12/19 23:55

親Windowでは public NewWindow[] newWin { get; set; } newWin.Show(); 子Windowでも、 NewWindow newWin; newWin.Show(); で、どんどん出来ます。 データをいろいろ比較したりして調べながら、どんどん開く感じです。
Zuishin

2019/12/20 00:36

2 以上と書きましたが、ウィンドウを一つ開くごとに AdornerWindow がもう一つ開かれるので、実質ウィンドウ一つにつき二つですね。App.Current.Windows.Count の値が 2 になったらメインウィンドウのみ残っているので、3 以上の時に閉じられなくすればいいと思います。
Zuishin

2019/12/20 00:36

「どんどん開く感じ」で何がまずいのかがわかりません。いくら開かれても自動的に App.Current.Windows に入ります。
FacePanel

2019/12/20 00:57

Zuishinさんのご回答の意味が分かりました。 ただ、沢山できた子Windowを次々に閉じて、最後に親Windowをも閉じようとしたら、閉じそこなった子Windowをアクティブにしたいときには、どうしたらよいでしょうか。 これは、別途の質問とすべきならば、仕切り直しますが。
Zuishin

2019/12/20 02:03

App.Current.Windows の中の MainWindow でも AdornerWindow でもないものが閉じそこなった子です。
TN8001

2019/12/20 03:02

AdornerWindowはデバッグ時(タイトルバーに「XAML の UI デバッグツール」が表示されている時)だけ付くので、単純に3以上ですとまずいです。 回答のように除外するのがいいですね。
guest

回答1

0

ベストアンサー

要するにこんな感じです。
最初のウィンドウのクラスは MainWindow で、他のウィンドウのクラスは違うという前提です。同じものだとそもそもこのイベントハンドラが他のウィンドウでも働いてしまうので変えた方がいいでしょう。

C#

1private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) 2{ 3 var windows = App 4 .Current 5 .Windows 6 .OfType<Window>() 7 .Where(a => !(a is MainWindow || a.GetType().Name == "AdornerWindow")) 8 .ToArray(); 9 e.Cancel = windows.Length > 0; 10 if (e.Cancel) 11 { 12 MessageBox.Show("子ウィンドウが閉じられていません"); 13 windows.First().Activate(); 14 } 15}

投稿2019/12/20 02:21

Zuishin

総合スコア28669

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

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

FacePanel

2019/12/20 03:43

.OfType<windo>() のところで、赤い波線が表示されて WindowColloctionが見つからないので、usingディレクティブを指定しないといけないようです。 どうしたらよいのでしょうか?
Zuishin

2019/12/20 03:49

System.Linq を使ってください。 こういう時は波線にキャレットを置いて Ctrl+. を押すのが楽です。
FacePanel

2019/12/20 12:02

これは素晴らしい。というところまで理解できました。 で、これから検証していきたいと思います。感想は、もう少し調査したうえにさせて下さい。 じつは、まだ、完璧に理解していないので。 ちょっと、Firstのところで、つっかえました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問