我有一个带有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而不是一个优雅的解决方案。有没有更好的解决方案不依赖于可视化树的确切内容?
答案 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 :(得分:0)
我相信MouseLeftButtonDown是一个隧道事件:您可以尝试使用PreviewMouseLeftButtonDown,在那里进行处理,然后确保e.Handled = false;正如你已经尝试过的那样 - 应该这样做!
希望有所帮助。
答案 2 :(得分:0)