3

我在一个更大的项目中遇到了这个问题......所以我设置了一个“测试项目”作为概念证明:

  • 新 Silverlight-应用程序
  • 添加列表框
  • 用几个复选框填充列表框
  • 注册 listBox1_MouseLeftButtonDown
  • 注册 listBox1_MouseRightButtonDown

你会看到,listBox1_MouseLeftButtonDown 在任何情况下都不会触发.... listBox1_MouseRightButtonDown 但是触发得很好。

我尝试使用从 ListBox 派生并覆盖的自定义类,假设 ListBox 类中的某些内容设置 e.Handled = false,但这也没有改变行为。

关于为什么会发生这种情况以及如何解决的任何想法?

(这个问题也阻止了“父”控件接收点击事件......所以事件传递被打破了)

:edit: 我用解决方法解决了我的问题......所以不再需要答案了。只是如果有人想弄清楚为什么会发生这种情况;)

4

2 回答 2

5

似乎回答了你的问题。去引用:

这是因为 ListBoxItem 在内部处理此事件以及 MouseLeftButtonDown 事件(停止冒泡)以实现项目选择。

解决方案是在代码隐藏文件中添加事件处理程序。来自文章:

尽管在路由事件处理程序中将 RoutedEventArgs 参数的 Handled 属性设置为 true 似乎可以停止隧道或冒泡,但在树的上方或下方的各个处理程序仍然可以选择接收事件!这只能从程序代码中完成,使用 AddHandler 的重载,该重载添加一个布尔型handedEventsToo 参数。

不过,请参阅最后的警告。

于 2010-08-09T03:21:22.753 回答
1

这是设计使然。如果您检查框架代码,您会看到 ListBoxItem 将 Handled 属性设置为 true。

我遇到了同样的问题,所以在我的 ListBoxItem.ItemTemplate 中,我在我的内容中添加了事件处理程序。

<ListBox.ItemTemplate>
    <DataTemplate>
        <StackPanel Orientation="Horizontal" MouseLeftButtonDown="StackPanel_MouseLeftButtonDown">
        ... other controls ...
        </StackPanel>
    </DataTemplate>
</ListBox.ItemTemplate>
于 2010-12-07T23:39:35.383 回答