Silverlight Listbox启动MouseRightButtonDown,但不启动MouseLeftButtonDown

Silverlight Listbox启动MouseRightButtonDown,但不启动MouseLeftButtonDown,silverlight,events,silverlight-4.0,mouseclick-event,Silverlight,Events,Silverlight 4.0,Mouseclick Event,我在一个更大的项目中遇到了这个问题。。。。。。因此,我建立了一个“测试项目”作为概念证明: 新的Silverlight应用程序 添加列表框 用几个复选框填充列表框 注册listBox1_MouseLeftButtonDown 注册列表框1\u鼠标右键向下 您将看到,listBox1_MouseLeftButtonDown在任何情况下都不会开火。。。。 listBox1_MouseRightButtonDown不过可以正常启动 我尝试使用从ListBox派生并重写的自定义类,假设ListBox

我在一个更大的项目中遇到了这个问题。。。。。。因此,我建立了一个“测试项目”作为概念证明:

  • 新的Silverlight应用程序
  • 添加列表框
  • 用几个复选框填充列表框
  • 注册listBox1_MouseLeftButtonDown
  • 注册列表框1\u鼠标右键向下
您将看到,listBox1_MouseLeftButtonDown在任何情况下都不会开火。。。。 listBox1_MouseRightButtonDown不过可以正常启动

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

有没有关于为什么会发生这种情况以及如何修复的想法

(此问题还会阻止“父”控件接收单击事件…因此事件传递中断)

:编辑: 我用解决方法解决了我的问题。。。因此不再需要答案了。只是如果有人想知道为什么会发生这样的事情;)

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

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

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

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


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

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

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

<ListBox.ItemTemplate>
    <DataTemplate>
        <StackPanel Orientation="Horizontal" MouseLeftButtonDown="StackPanel_MouseLeftButtonDown">
        ... other controls ...
        </StackPanel>
    </DataTemplate>
</ListBox.ItemTemplate>

... 其他控件。。。

你应该发布你的解决方案,作为对其他人的回答。该解决方案仅适用于我的情况。。。我用一种不同的方式去做我想做的事。这不是解决这个问题的通用方法。