【发布时间】:2019-10-19 15:07:06
【问题描述】:
我正在开设关于 WPF 中的事件处理的在线课程。在有关隧道和冒泡事件的部分中,有人告诉我使用以下代码示例来跟踪被触发的事件序列(使用断点):
查看:
<Grid PreviewMouseDown="Grid_PreviewMouseDown">
<Button Name="btnFirst" Width="200" Height="200" Click="Button_Click">
<Image MouseDown="Image_MouseDown" Source="Assets/pic.jpg"></Image>
</Button>
</Grid>
代码隐藏:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Grid_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{ // Breakpoint goes here
}
private void Image_MouseDown(object sender, MouseButtonEventArgs e)
{ // Breakpoint goes here
}
private void Button_Click(object sender, RoutedEventArgs e)
{ // Breakpoint goes here
}
}
结果:
在课程中,点击图片会触发所有三个事件处理程序,但是当我尝试时,只调用了 Grid_PreviewMouseDown 和 Image_MouseDown,Button_Click 似乎完全被忽略了。这是预期的行为还是我在这里遗漏了什么?顺便说一句,该课程是从 2014 年开始的。
我注意到的一件事是 Button_Click 仅在我从 Grid 标记中删除 PreviewMouseDown 属性并单击按钮本身(而不是图像里面)。
【问题讨论】:
-
我无法重现该问题,单击按钮或内部图像时会调用所有三个事件。您在
Button_Click处理程序的代码示例中写了“// Breakpoint goes here”,这是否意味着它按预期工作?这令人困惑。此外,我在您的代码中没有看到它,但请确保您不要在您的Image_MouseDown处理程序中写入e.Handled = true,因为它确实会停止事件传播。 -
@CorentinPane “断点在此处注释”表示我在 Visual Studio 中放置断点以检查调用了哪些方法。方法是空的,没有代码设置事件的 Handled 属性。
-
哦,好吧,我误会了,我虽然你的意思是断点是 hitting 你放置 cmets 的地方,我的错。很奇怪,它对你不起作用。您能否上传并分享您的整个解决方案,以便我仔细查看?
-
@CorentinPane,你去:github.com/RafalDardzinski/Events-Test
-
你刚刚上传了一个空项目,你的
MainWindow中没有代码也没有xaml:/
标签: c# wpf xaml event-handling