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

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

新規登録して質問してみよう
ただいま回答率
85.50%
WPF

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

Q&A

解決済

1回答

6229閲覧

WPFで子ウィンドウ側のマウスイベントが取れない

suzuki123

総合スコア18

WPF

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

0グッド

0クリップ

投稿2016/12/26 09:49

編集2016/12/27 00:59

###現象
メインウィンドウから子ウィンドウを起動し、その配下のUserControlに登録したマウスイベントを処理しようと以下のように記述しました。
実際動かすと、「IMG_TEST2」は処理されず、「GRD_TEST」側だけ処理されました。

###質問
そもそも入れ子状態になっている部品に対して、マウスイベントの登録は出来ないのでしょうか?
※実際に動かした結果が答えなのは分かるのですが、なぜ登録できないのかを説明していただけると助かります。(それがWPFの仕様だった場合、それを証明できる記述がされているURLを教えてください。)

###該当のソースコード

public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); WindowStartupLocation = WindowStartupLocation.CenterScreen; BTN.Click += new RoutedEventHandler(OnClick); BTN2.Click += new RoutedEventHandler(OnClick2); } private void OnClick(object sender, RoutedEventArgs e) { TestWindow aa = new TestWindow(); aa.ShowDialog(); } private void OnClick2(object sender, RoutedEventArgs e) { } }
<Window x:Class="WpfTest.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:WpfTest" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" Title="MainWindow" Width="450" Height="350" mc:Ignorable="d"> <Grid> <StackPanel> <Button x:Name="BTN" HorizontalAlignment="Left" VerticalAlignment="Top" /> <Button x:Name="BTN2" HorizontalAlignment="Left" VerticalAlignment="Top" /> </StackPanel> </Grid> </Window>
<Window x:Class="WpfTest.TestWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:WpfTest" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" Title="TestWindow" Width="200" Height="200" mc:Ignorable="d"> <Grid> <local:UcTest_02 x:Name="UC_TEST_02" /> </Grid> </Window>
public partial class UcTest_02 : UserControl { public UcTest_02() { InitializeComponent(); IMG_TEST2.PreviewMouseLeftButtonDown += new MouseButtonEventHandler(OnPMLD); IMG_TEST2.PreviewMouseRightButtonDown += new MouseButtonEventHandler(OnPMRD); IMG_TEST2.PreviewMouseDown += new MouseButtonEventHandler(OnPMD); IMG_TEST2.MouseDown += new MouseButtonEventHandler(OnMD); IMG_TEST2.PreviewKeyDown += new KeyEventHandler(OnPreKey); GRD_TEST.PreviewMouseDown += new MouseButtonEventHandler(OnPMD2); } private void OnMD(object sender, MouseButtonEventArgs e) { Keyboard.Focus(IMG_TEST2); } private void OnPMD(object sender, MouseButtonEventArgs e) { Keyboard.Focus(IMG_TEST2); } private void OnPMLD(object sender, MouseButtonEventArgs e) { Keyboard.Focus(IMG_TEST2); } private void OnPMRD(object sender, MouseButtonEventArgs e) { Keyboard.Focus(IMG_TEST2); } private void OnPMD2(object sender, MouseButtonEventArgs e) { Keyboard.Focus(IMG_TEST2); } private void OnPreKey(object sender, KeyEventArgs e) { return; } }
<UserControl x:Class="WpfTest.UcTest_02" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:WpfTest" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" d:DesignHeight="300" d:DesignWidth="300" mc:Ignorable="d"> <Grid> <Grid x:Name="GRD_TEST" Width="100" Height="100" Margin="10,10,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Background="Red"> <Image x:Name="IMG_TEST1" HorizontalAlignment="Left" VerticalAlignment="Top" /> <Image x:Name="IMG_TEST2" HorizontalAlignment="Left" VerticalAlignment="Top" Focusable="true" /> </Grid> </Grid> </UserControl>

###補足情報(言語/FW/ツール等のバージョンなど)
Windows7 Pro 64bit
visual studio 2015 pro
.NETフレームワーク 4.6.1

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

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

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

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

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

twyujiro15

2016/12/26 23:53

"IMG_TEST2" や "GRD_TEST" とは何者でしょうか。また、UcTest_02 ユーザーコントロールにはどのようなコントロールが配置されているのでしょうか。もう少しコードを詳しく書いてください。
suzuki123

2016/12/27 01:02

申し訳ございませんでした。コードに関しては追記いたしました。
guest

回答1

0

ベストアンサー

Image コントロールに画像を指定していないことが原因です。
画像を表示しないと、掲載されているコードにおける状況では
Image コントロールのサイズが幅、高さともにゼロなので、
マウスでクリックすることができない状態になっています。

下記のように Image コントロールに対して Source プロパティなどで画像を表示するようにしてください。

XAML

1<UserControl x:Class="WpfApplication1.UcTest_02" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 5 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 6 mc:Ignorable="d" 7 d:DesignHeight="300" d:DesignWidth="300"> 8 <Grid> 9 <Grid x:Name="GRD_TEST" 10 Width="100" Height="100" 11 Margin="10,10,0,0" 12 HorizontalAlignment="Left" 13 VerticalAlignment="Top" 14 Background="Red"> 15 <Image x:Name="IMG_TEST1" Source="Penguins.jpg" HorizontalAlignment="Left" VerticalAlignment="Top" /> 16 <Image x:Name="IMG_TEST2" Source="Koala.jpg" HorizontalAlignment="Left" VerticalAlignment="Top" Focusable="True" /> 17 </Grid> 18 </Grid> 19</UserControl>

この状態で実行して画像部分をマウス左クリックしたときの出力結果は次のようになりました。

OnPMD2

OnPMLD
OnPMD
OnMD

つまり IMG_TEST2 と GRD_TEST のイベントハンドラが
Preview (トンネル型) から Preview なし (バブル型) へ、
イベントハンドラを登録した順にきちんと呼び出されています。

イベントは基本的には重なっているコントロールすべてにおいて順番に発生します。
途中 Button コントロールなどが重なっていると内部処理でイベントの伝搬が打ち切られることがあります。
例えば質問に掲載されている UcTest_02 ユーザーコントロールの XAML では
Image コントロールを Grid パネルの上に置いていますが、
その上にさらに Button コントロールを重ねると上記のイベント発生状況が変化します。

XAML

1<UserControl x:Class="WpfApplication1.UcTest_02" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 5 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 6 mc:Ignorable="d" 7 d:DesignHeight="300" d:DesignWidth="300"> 8 <Grid> 9 <Grid x:Name="GRD_TEST" 10 Width="100" Height="100" 11 Margin="10,10,0,0" 12 HorizontalAlignment="Left" 13 VerticalAlignment="Top" 14 Background="Red"> 15 <Image x:Name="IMG_TEST1" Source="Penguins.jpg" HorizontalAlignment="Left" VerticalAlignment="Top" /> 16 <Image x:Name="IMG_TEST2" Source="Koala.jpg" HorizontalAlignment="Left" VerticalAlignment="Top" Focusable="True" /> 17 <!-- ボタンを追加 --> 18 <Button Content="Click me." /> 19 </Grid> 20 </Grid> 21</UserControl>

この状態で実行し、追加されたボタンをマウス左クリックしたとき、出力結果は次のようになります。

OnPMD2

Image(IMG_TEST2) コントロールに関するイベントハンドラの処理がごっそりなくなっています。
これは Grid パネルの上に Button、Image(IMG_TEST2)、Image(IMG_TEST1) が順に重なっているからです。
まず Grid の Preview イベントが発生し、次に Button コントロールにそのイベントが伝搬します。
Button コントロールではマウス系のイベントを内部で処理しており、
以降のイベント伝搬を継続しないという仕様になっています。
したがって、Button コントロールの後ろにある Image(IMG_TEST2) にイベントが伝わらなくなります。

投稿2016/12/27 01:23

編集2016/12/27 02:33
twyujiro15

総合スコア217

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

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

suzuki123

2016/12/27 02:11

>結果から言うと、一体何が問題なのかがわかりませんでした。  →各キーイベントにブレークポイントを設定し、実行確認すると、「GRD_TEST」に登録したイベントしか止まりませんでした。   ※ブレークポイントに止まらないので、writelineで試しても結果は同じでした。    >途中 Button コントロールなどが重なっていると内部処理でイベントの伝搬が打ち切られることがあります。  →こちらに関して、具体的にどういった感じを重なっていると言えるのか例を示していただけるとありがたいです。
twyujiro15

2016/12/27 02:33

すみません。テストしたコードが間違っていました。 テストし直してイベントが発生しないという状況が確認できました。 回答を修正しましたのでご確認ください。
suzuki123

2016/12/27 03:33

>テストし直してイベントが発生しないという状況が確認できました。  →内容を確認し、指摘どおりに修正した所、正常にイベントが取得できました。 >Button コントロールではマウス系のイベントを内部で処理しており、 以降のイベント伝搬を継続しないという仕様になっています。  →このような情報(/仕様)は知らなかったので大変ありがたいです。 本件に関しまして、解決とさせていただきます。有難うございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問