C# 拖动时更改ZIndex

C# 拖动时更改ZIndex,c#,wpf,C#,Wpf,我在画布中拖动不同的StackPanels,但当我在同一画布中拖动另一个StackPanel时,它会抓住该画布,而不是当前正在拖动的。我正试图用Zindex解决这个问题。这是正确的方法吗? 到目前为止,我的代码是: private void UIElement_OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e) { StackPanel sp = (StackPanel)sender; Panel.SetZIn

我在画布中拖动不同的
StackPanel
s,但当我在同一画布中拖动另一个
StackPanel
时,它会抓住该画布,而不是当前正在拖动的。我正试图用
Zindex
解决这个问题。这是正确的方法吗? 到目前为止,我的代码是:

private void UIElement_OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    StackPanel sp = (StackPanel)sender;
    Panel.SetZIndex(sp, 99999);
    sp.Background = Brushes.Red;
    Console.WriteLine(Panel.GetZIndex(sp));
}

private void UIElement_OnMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
    StackPanel sp = (StackPanel)sender;
    Panel.SetZIndex(sp, -10);
    sp.Background = Brushes.Green;
    Console.WriteLine(Panel.GetZIndex(sp));
}

private void UIElement_OnMouseMove(object sender, MouseEventArgs e) 
{
    if (e.LeftButton == MouseButtonState.Pressed) 
    { 
        StackPanel sp = (StackPanel) sender; 
        SymbolModel sm = sp.DataContext as SymbolModel; 
        Point pos = e.GetPosition(SymbolViewControl); 
        if (pos.X > 10 && pos.Y > 10) 
        { 
            sm.CanvasTop = pos.Y-10; 
            sm.CanvasLeft = pos.X-10; 
        } 
    } 
}

颜色和书写线仅用于测试,它们似乎按预期工作。Zindex在button down和button up上设置正确,但元素似乎并不在意。

在mousedown和mouseup方法中使用CaptureMouse和ReleaseMouseCapture似乎解决了主要问题

private void UIElement_OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        StackPanel sp = (StackPanel)sender;
        Panel.SetZIndex(sp, 99999);
        sp.CaptureMouse(); //This
    }

    private void UIElement_OnMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {
        StackPanel sp = (StackPanel)sender;
        Panel.SetZIndex(sp, -10);
        sp.ReleaseMouseCapture(); //And this
    } 

无论发布之前发生了什么,它都会紧紧抓住我开始抓图的那一个。Z索引仍然错误,我仍然需要对此进行修复。

您能展示移动这些面板背后的全部逻辑吗?@Mateusz-Sure-thing(不确定如何格式化)。私有void UIElement_OnMouseMove(对象发送方,MouseEventArgs e){if(e.LeftButton==MouseButtonState.Pressed){StackPanel sp=(StackPanel)发送方;SymbolModel sm=sp.DataContext作为SymbolModel;Point pos=e.GetPosition(SymbolViewControl);如果(pos.X>10&&pos.Y>10){sm.CanvasTop=pos.Y-10;sm.canvasleet=pos.X-10;}}}}}则canvasleet和Top是绑定属性