当布局更改时,防止WPF ListBox在鼠标下选择项目

| 如果在按住鼠标按钮的同时WPF ListBox收到MouseMove事件,它将更改列表框的选择。也就是说,如果在项目#1上单击鼠标,然后将其拖到项目#2上,它将取消选择项目#1并选择项目#2。我该如何预防? 那是短版。稍长一点的版本是这样的:当用户双击ListBox中的项目时,我对布局进行了其他更改,包括在ListBox上方显示其他控件。这会将ListBox向下移动,这意味着鼠标现在位于与用户双击时不同的ListBoxItem上方。 由于我是根据DoubleClick事件(这是鼠标按下事件)做出这些布局更改的,因此很有可能在此布局更改完成后仍会按下鼠标按钮,这意味着WPF将向ListBox发送一个MouseMove事件(因为鼠标相对于ListBox的位置已更改)。 ListBox将此视为拖动,并选择鼠标下的事件。 我不希望在获得双击事件的时间与用户释放鼠标的时间(可能在布局更改后很好)之间进行选择更改。我怀疑实现此目的的最简单方法是禁用“更改拖动时的选择”行为,但是我愿意接受其他建议。 如何双击双击“锁定”选择,并防止更改直到鼠标悬停?     
已邀请:
在ILSpy中进行了一些深入研究之后,我发现没有属性可以禁用“拖动以选择”行为,也没有可以标记为“已处理”的事件来停止它。 但是,有一个很好的拐点可以更改此行为:ListBoxItem.OnMouseEnter是虚拟的,它回调到列表框中以更改选择。它似乎并没有做任何实质性的事情,因此我需要做的就是覆盖它,什么也不做。 编辑:事实证明,以上内容仅使您在列表框内移动鼠标时不会更改选择。如果将鼠标移到列表框的上方或下方则无济于事-然后自动滚动会启动并移动所选内容。大多数自动滚动代码还是使用非虚拟方法。看来,防止自动滚动的最佳方法可能是禁用鼠标捕获。 ListBoxItem上的另一个重写可以解决此问题。 看来使用我自己的ListBoxItem后代的最佳方法是从ListBox继承。最终代码如下所示:
public class ListBoxEx : ListBox
{
    protected override DependencyObject GetContainerForItemOverride()
    {
        return new ListBoxExItem();
    }
    protected override bool IsItemItsOwnContainerOverride(object item)
    {
        return item is ListBoxExItem;
    }
}
public class ListBoxExItem : ListBoxItem
{
    private Selector ParentSelector
    {
        get { return ItemsControl.ItemsControlFromItemContainer(this) as Selector; }
    }

    protected override void OnMouseEnter(MouseEventArgs e)
    {
    }
    protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
    {
        base.OnMouseLeftButtonDown(e);
        ParentSelector?.ReleaseMouseCapture();
    }
}
    

要回复问题请先登录注册