回答編集履歴

1

テストした XAML コードの記載漏れと出力結果の誤記修正。Button コントロールの重なりについての説明を追記。

2016/12/27 02:33

投稿

twyujiro15
twyujiro15

スコア217

test CHANGED
@@ -1,144 +1,68 @@
1
- イベントは基本的には重なっているコントロールすべにおて順番に発生します。
1
+ Image コントロールに画像を指定していないことが原因です。
2
2
 
3
+ 画像を表示しないと、掲載されているコードにおける状況では
4
+
3
- 途中 Button コントロールなどっていると内部処理イベントの伝搬が打ち切られることがあります。
5
+ Image コントロールのサイズ幅、高さともにゼロ
6
+
7
+ マウスでクリックすることができない状態になっています。
4
8
 
5
9
 
6
10
 
7
- いまいちやりたいことが見えなかったでとりあえず掲載されたコー実行してみました
11
+ 下記ように Image ントロルに対して Source プロパティなどで画像表示するようにしてください
8
-
9
- 結果から言うと、一体何が問題なのかがわかりませんでした。
10
12
 
11
13
 
12
14
 
13
- UcTest_02 ユーザーコントロールのコードビハインドを次のように変更して実行しました。
15
+ ```XAML
14
16
 
15
- イベント発生時に出力ウィンドウへメッセージを出力するようにしています。
17
+ <UserControl x:Class="WpfApplication1.UcTest_02"
16
18
 
19
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
17
20
 
21
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
18
22
 
19
- ```C#
23
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
20
24
 
21
- namespace WpfApplication1
25
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
22
26
 
23
- {
27
+ mc:Ignorable="d"
24
28
 
25
- using System.Windows.Controls;
29
+ d:DesignHeight="300" d:DesignWidth="300">
26
30
 
27
- using System.Windows.Input;
31
+ <Grid>
28
32
 
33
+ <Grid x:Name="GRD_TEST"
29
34
 
35
+ Width="100" Height="100"
30
36
 
31
- /// <summary>
37
+ Margin="10,10,0,0"
32
38
 
33
- /// UcTest_02.xaml の相互作用ロジック
39
+ HorizontalAlignment="Left"
34
40
 
35
- /// </summary>
41
+ VerticalAlignment="Top"
36
42
 
37
- public partial class UcTest_02 : UserControl
43
+ Background="Red">
38
44
 
39
- {
45
+ <Image x:Name="IMG_TEST1" Source="Penguins.jpg" HorizontalAlignment="Left" VerticalAlignment="Top" />
40
46
 
41
- public UcTest_02()
47
+ <Image x:Name="IMG_TEST2" Source="Koala.jpg" HorizontalAlignment="Left" VerticalAlignment="Top" Focusable="True" />
42
48
 
43
- {
49
+ </Grid>
44
50
 
45
- InitializeComponent();
51
+ </Grid>
46
52
 
47
-
48
-
49
- IMG_TEST2.PreviewMouseLeftButtonDown += new MouseButtonEventHandler(OnPMLD);
50
-
51
- IMG_TEST2.PreviewMouseRightButtonDown += new MouseButtonEventHandler(OnPMRD);
52
-
53
- IMG_TEST2.PreviewMouseDown += new MouseButtonEventHandler(OnPMD);
54
-
55
- IMG_TEST2.MouseDown += new MouseButtonEventHandler(OnMD);
56
-
57
- IMG_TEST2.PreviewKeyDown += new KeyEventHandler(OnPreKey);
58
-
59
-
60
-
61
- GRD_TEST.PreviewMouseDown += new MouseButtonEventHandler(OnPMD2);
62
-
63
- }
64
-
65
-
66
-
67
- private void OnMD(object sender, MouseButtonEventArgs e)
68
-
69
- {
70
-
71
- System.Diagnostics.Debug.WriteLine("OnMD");
53
+ </UserControl>
72
-
73
- }
74
-
75
-
76
-
77
- private void OnPMD(object sender, MouseButtonEventArgs e)
78
-
79
- {
80
-
81
- System.Diagnostics.Debug.WriteLine("OnPMD");
82
-
83
- }
84
-
85
-
86
-
87
- private void OnPMLD(object sender, MouseButtonEventArgs e)
88
-
89
- {
90
-
91
- System.Diagnostics.Debug.WriteLine("OnPMLD");
92
-
93
- }
94
-
95
-
96
-
97
- private void OnPMRD(object sender, MouseButtonEventArgs e)
98
-
99
- {
100
-
101
- System.Diagnostics.Debug.WriteLine("OnPMRD");
102
-
103
- }
104
-
105
-
106
-
107
- private void OnPMD2(object sender, MouseButtonEventArgs e)
108
-
109
- {
110
-
111
- System.Diagnostics.Debug.WriteLine("OnPMD2");
112
-
113
- }
114
-
115
-
116
-
117
- private void OnPreKey(object sender, KeyEventArgs e)
118
-
119
- {
120
-
121
- System.Diagnostics.Debug.WriteLine("OnPreKey");
122
-
123
- return;
124
-
125
- }
126
-
127
- }
128
-
129
- }
130
54
 
131
55
  ```
132
56
 
133
57
 
134
58
 
135
- 実行して赤色背景の部分をマウス左クリックしたときの出力結果は次のようになりました。
59
+ この状態で実行して画像部分をマウス左クリックしたときの出力結果は次のようになりました。
136
60
 
137
- > OnPMLD
61
+ > OnPMD2
62
+
63
+ OnPMLD
138
64
 
139
65
  OnPMD
140
-
141
- OnPMD2
142
66
 
143
67
  OnMD
144
68
 
@@ -149,3 +73,81 @@
149
73
  Preview (トンネル型) から Preview なし (バブル型) へ、
150
74
 
151
75
  イベントハンドラを登録した順にきちんと呼び出されています。
76
+
77
+
78
+
79
+ イベントは基本的には重なっているコントロールすべてにおいて順番に発生します。
80
+
81
+ 途中 Button コントロールなどが重なっていると内部処理でイベントの伝搬が打ち切られることがあります。
82
+
83
+ 例えば質問に掲載されている UcTest_02 ユーザーコントロールの XAML では
84
+
85
+ Image コントロールを Grid パネルの上に置いていますが、
86
+
87
+ その上にさらに Button コントロールを重ねると上記のイベント発生状況が変化します。
88
+
89
+ ```XAML
90
+
91
+ <UserControl x:Class="WpfApplication1.UcTest_02"
92
+
93
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
94
+
95
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
96
+
97
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
98
+
99
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
100
+
101
+ mc:Ignorable="d"
102
+
103
+ d:DesignHeight="300" d:DesignWidth="300">
104
+
105
+ <Grid>
106
+
107
+ <Grid x:Name="GRD_TEST"
108
+
109
+ Width="100" Height="100"
110
+
111
+ Margin="10,10,0,0"
112
+
113
+ HorizontalAlignment="Left"
114
+
115
+ VerticalAlignment="Top"
116
+
117
+ Background="Red">
118
+
119
+ <Image x:Name="IMG_TEST1" Source="Penguins.jpg" HorizontalAlignment="Left" VerticalAlignment="Top" />
120
+
121
+ <Image x:Name="IMG_TEST2" Source="Koala.jpg" HorizontalAlignment="Left" VerticalAlignment="Top" Focusable="True" />
122
+
123
+ <!-- ボタンを追加 -->
124
+
125
+ <Button Content="Click me." />
126
+
127
+ </Grid>
128
+
129
+ </Grid>
130
+
131
+ </UserControl>
132
+
133
+ ```
134
+
135
+ この状態で実行し、追加されたボタンをマウス左クリックしたとき、出力結果は次のようになります。
136
+
137
+
138
+
139
+ > OnPMD2
140
+
141
+
142
+
143
+ Image(IMG_TEST2) コントロールに関するイベントハンドラの処理がごっそりなくなっています。
144
+
145
+ これは Grid パネルの上に Button、Image(IMG_TEST2)、Image(IMG_TEST1) が順に重なっているからです。
146
+
147
+ まず Grid の Preview イベントが発生し、次に Button コントロールにそのイベントが伝搬します。
148
+
149
+ Button コントロールではマウス系のイベントを内部で処理しており、
150
+
151
+ 以降のイベント伝搬を継続しないという仕様になっています。
152
+
153
+ したがって、Button コントロールの後ろにある Image(IMG_TEST2) にイベントが伝わらなくなります。