【问题标题】:MouseDown event handler seem to block Click event handler from being invokedMouseDown 事件处理程序似乎阻止调用 Click 事件处理程序
【发布时间】: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_PreviewMouseDownImage_MouseDownButton_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


【解决方案1】:

由于我们没有其他选项,我建议您重新安装最新版本的 Visual Studio,其中包含与 .NET Framework 和 WPF 开发相关的所有工作负载包 - 有时可能会出现一些损坏。

【讨论】:

  • 原来这是我的 Visual Studio 2017 版本的问题 - 通过 Visual Studio 安装程序更新它完全解决了这个问题。谢谢你的帮助,干杯!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多