C# 鼠标不';无法在Grid.Children.Clear()上调用

C# 鼠标不';无法在Grid.Children.Clear()上调用,c#,wpf,grid,mouse,C#,Wpf,Grid,Mouse,我在一个从UserControl派生的类中拥有这段代码(从Window派生时的行为相同)。这段代码是一个非常简单的示例(解决了这个问题),它来自一个项目,在这个项目中,我只想在鼠标向下和鼠标向上之间移动一些行(我不能直接引用这些行),唯一的方法是删除它们,然后再次将它们添加到正确的位置 protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) { m_Grid.Children.Clear( );

我在一个从
UserControl
派生的类中拥有这段代码(从Window派生时的行为相同)。这段代码是一个非常简单的示例(解决了这个问题),它来自一个项目,在这个项目中,我只想在鼠标向下和鼠标向上之间移动一些行(我不能直接引用这些行),唯一的方法是删除它们,然后再次将它们添加到正确的位置

protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
{
    m_Grid.Children.Clear( );
    m_Grid.Children.Add(new Button());
    base.OnMouseLeftButtonDown(e);
}

protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e)
{
    m_Grid.Children.Clear();
    base.OnMouseLeftButtonUp(e);
}
其中
m_Grid
声明如下:

private readonly Grid m_Grid;
在这种形式下,
OnMouseLeftButtonUp
永远不会被调用。 如果我删除:

m_Grid.Children.Clear( );
m_Grid.Children.Add(new Button());
调用OnMouseLeftButtonUp


你知道为什么吗?

在这里,你设置了
窗口或
用户控件的mouseUp事件,以便:
在您执行鼠标移动时,光标必须位于
窗口
用户控件
的表面上,而不是
按钮
或网格上,以便触发鼠标移动事件

要解决此问题,请添加:

protected override void OnPreviewMouseLeftButtonUp(MouseButtonEventArgs e)
        {
            m_Grid.Children.Clear();
            base.OnPreviewMouseLeftButtonUp(e);
        }

虽然你们的问题有点不清楚,但你们为什么说那个不叫?您是如何测试此行为的?在OnMouseLeftButtonUp中使用断点。我也可以这样说:我建议使用鼠标后的按钮来查看可视化树中的哪个元素正在处理您的事件。我在网格宽度(小宽度和高度)上尝试了您的代码,效果很好!我猜您正在添加的按钮添加到鼠标光标下的某个位置,因此up事件由新添加的按钮处理。尝试挂起OnPreviewMouseLeftButtonUp。如果该按钮触发,您的按钮可能正在处理OnMouseLeftButtonUp。是否有一种简单的方法为家长转发该事件?我不想从每个形状派生类并将事件转发给父级。这在原始项目中对我不起作用-没有调用OnPreviewMouseLeftButtonUp。我在OnPreviewMouseLeftButtonDown()中使用了CaptureMouse(),并在OnMouseLeftButtonUp()中释放了捕获以使其工作