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

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

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

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

Visual Studio 2012

Microsoft Visual Studio 2012は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2010の次のバージョンです

WPF

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

Q&A

解決済

1回答

12502閲覧

VS2012 WPFのZオーダーについて教えてください。

kumaneko

総合スコア15

C#

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

Visual Studio 2012

Microsoft Visual Studio 2012は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2010の次のバージョンです

WPF

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

0グッド

1クリップ

投稿2015/06/23 12:11

VisualStudio2012のC#、WPFで質問です。

WPFのWindowのTopmostプロパティをTrueに設定するWindowが2つあるとします。
( 仮にA, Bとします。)

AのWindowを表示した後、BのWindowを表示すると、BのWindowがAのWindowの前面に表示されますよね?
このような時、他にTopmostがTrueと設定されているWindowが存在しても必ずAのWindowが前面に出るようにしたいのです。
考えたのが、AのWindow側で自身よりも前に(自分よりもZオーダーが低いというんでしょうか。)Windowが表示されたことをイベントなどで知ることができれば、よいのではないかということです。

そこで教えていただきたいのが、TopmostプロパティがTrueで設定されているWindowが自身よりも前に別のWindowが表示されたとき、そのことをイベントなどで検知する方法はないのでしょうか。
( またはTopmostプロパティがtrueとなっているWindowが複数あっても、必ず最前面に表示される方法でもかまいません。)

わかりづらいかもしれませんが、ご存知の方がいらっしゃいましたら、教えてください。
よろしくお願いいたします。

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

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

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

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

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

Tak1wa

2015/06/24 00:07

BはAによって生成・表示されますか?それともAとBは別アプリですか?何を以て「AよりBを前面にする」と判断しますか。
Tak1wa

2015/06/24 00:13

もう1点、TopMostプロパティを使ってWindowを最前面にする意図を教えてください。そもそもTopMostプロパティを使うのが妥当か、という懸念もありますので。
kumaneko

2015/06/26 11:50 編集

ご回答ありがとうございます。 返答が遅れ、申し訳ありません。 > もう1点、TopMostプロパティを使ってWindowを最前面にする意図を教えてください。そもそもTopMostプロパティを使うのが妥当か、という懸念もありますので。 (例題でいうと)Bのウィンドウは常に最前面に出て情報の表示をする。しかし、(メインウィンドウ)のAのウィンドウもTopmostとしたい。( ほかのウィンドウを前に回りこませたくない。)という仕様だったのです。 しかし、これではAをクリックすればAが、BがクリックすればBが前面に出てしまい、Bが常に前面に出る。という条件が満たせません。 そのため、双方Topmost(ほかのウィンドウが前に表示されない)を保ちつつ、常にBのウィンドウを前に表示する。という方法を行いたかったのです。 Ownerの設定について試してみます。 お忙しい中、ご回答ありがとうございました。
guest

回答1

0

ベストアンサー

WindowAとWindowBが同一アプリケーション内であると前提した場合で回答します。
WindowのOwnerプロパティで親を指定させます。

親子関係の設定を行うことで、いくつか副作用も発生します。詳細はMSDNを参照してください。
Window.Owner プロパティ

AとBを呼び出す画面(仮にMainWindowとします。)があるのであれば、
AはTopMost=true、BはTopMost=falseでOwnerにCを設定すれば良いと思います。

lang

1public partial class MainWindow : Window 2{ 3 public MainWindow() 4 { 5 InitializeComponent(); 6 } 7 8 private void btnA_Click(object sender, RoutedEventArgs e) 9 { 10 var A = new WindowA(); 11 A.Topmost = true; 12 A.Show(); 13 } 14 15 private void btnB_Click(object sender, RoutedEventArgs e) 16 { 17 var B = new WindowB(); 18 B.Topmost = false; 19 B.Owner = this; 20 B.Show(); 21 } 22}

Window.Topmost プロパティ

WindowAとWindowBが別アプリケーションの場合は、やれるかわかりませんが
出来たとしても、もう少し低い層でフックする必要がありそうです。


#追記
よく見たら、Aを常にあとから表示されるTopmostなBの前面に表示したいということなので、
ご質問の意図と異なる回答をしていましたのでソースと一部内容を修正しました。

投稿2015/06/24 00:33

編集2015/06/24 01:05
Tak1wa

総合スコア4791

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

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

kumaneko

2015/06/26 11:51

ご回答ありがとうございます。 WPFを触って日が浅く、Ownerについては知りませんでした。 調査して、使用できないか確認してみます。 ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問