代码之家  ›  专栏  ›  技术社区  ›  Steav

Silverlight列表框正在触发MouseLightButtonDown,但不是MouseLeftButtonDown

  •  3
  • Steav  · 技术社区  · 16 年前

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

    • 新建Silverlight应用程序
    • 添加列表框
    • 用几个复选框填充列表框
    • 注册列表框1_mouseleftbuttondown
    • 注册列表框1_MouserLightButtonDown

    你会发现,在任何情况下,listbox 1_mouseLeftButtonDown都不会启动…… 但是,列表框1“鼠标右键”按钮关闭后,可以正常触发。

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

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

    (此问题还阻止“父”控件接收单击事件…所以事件过去了)

    编辑: 我用解决方法解决了我的问题…所以不再需要答案了。如果有人想知道为什么会发生这种事,就为了它;)

    2 回复  |  直到 15 年前
        1
  •  5
  •   Chry Cheng    16 年前

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

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

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

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

    不过,请看最后的警告。

        2
  •  1
  •   Dan Bailiff    15 年前

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

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

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