首页 > 解决方案 > 拖动时更改 ZIndex

问题描述

我在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 在按钮向下和按钮向上时设置正确,但元素似乎并不在意。

标签: c#wpf

解决方案


在 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-index 仍然是错误的,我仍然需要修复它。


推荐阅读