###現象
メインウィンドウから子ウィンドウを起動し、その配下の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
回答1件
あなたの回答
tips
プレビュー