ListBoxItem子项(WPF)中的鼠标交互

时间:2010-05-23 20:32:07

标签: wpf listbox mouse selection listboxitem

我有一个带有ItemTemplate的ListBox,其中包含一个与鼠标交互的控件。这会干扰ListBox的选择功能,即单击控件不会选择该项。这是因为ListBoxItem在OnMouseLeftButtonDown中将鼠标事件的Handled属性设置为true。我尝试了以下

protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) {
    base.OnMouseLeftButtonDown(e);
    e.Handled = false;
}

但ListBoxItem“接管”鼠标并阻止控件进行自己的交互。然后我有了另一个想法

protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) {
    base.OnMouseLeftButtonDown(e);
    ((ListBoxItem)VisualTreeHelper.GetParent(VisualTreeHelper.GetParent(VisualTreeHelper.GetParent(this)))).IsSelected = true;
}

实际上有效,但感觉更像一个丑陋的kludge而不是一个优雅的解决方案。有没有更好的解决方案不依赖于可视化树的确切内容?

3 个答案:

答案 0 :(得分:0)

我找到了一种不那么重要的方法:

protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) {
    base.OnMouseLeftButtonDown(e);
    Selector.SetIsSelected(this, true);
}

为了使这有任何效果,ListBox的ItemTemplate中的控件需要以下XAML属性:

Selector.IsSelected="{Binding IsSelected, Mode=OneWayToSource, RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}}"

它提出了两个新问题:

  1. 定义自己的依赖项属性而不是找到当前未使用的附加属性会更好吗?
  2. 有没有办法在标记中实现类似的东西?

答案 1 :(得分:0)

我相信MouseLeftButtonDown是一个隧道事件:您可以尝试使用PreviewMouseLeftButtonDown,在那里进行处理,然后确保e.Handled = false;正如你已经尝试过的那样 - 应该这样做!

希望有所帮助。

答案 2 :(得分:0)