【问题标题】:Silverlight Listbox firing MouseRightButtonDown, but not MouseLeftButtonDownSilverlight 列表框触发 MouseRightButtonDown,但不是 MouseLeftButtonDown
【发布时间】:2010-05-11 09:20:00
【问题描述】:

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

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

您会看到,listBox1_MouseLeftButtonDown 在任何情况下都不会触发.... listBox1_MouseRightButtonDown 然而触发就好了。

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

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

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

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

【问题讨论】:

  • 你应该发布你的解决方法作为其他人的答案
  • 解决方法仅对我的情况特别...我使用不同的方式来做我想做的事情。这不是解决此问题的一般解决方法。

标签: silverlight events silverlight-4.0 mouseclick-event


【解决方案1】:

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

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

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

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

请参阅最后的警告。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-28
      • 1970-01-01
      • 1970-01-01
      • 2012-03-02
      • 2016-06-22
      相关资源
      最近更新 更多