在“画布”上拖放元素

时间:2014-03-05 16:03:27

标签: c# .net user-interface canvas pixelsense

这可能是一个非常基本的问题。我有一个画布,我在运行时(TextBoxes,Shapes,Buttons)放置了不同的元素。现在我希望能够将这些元素拖放到同一画布上的另一个位置。

任何人都可以为我提供一些代码,如何在运行时实现像onDrag这样的东西?

1 个答案:

答案 0 :(得分:0)

您可以使用MouseDown,MouseMove和MouseUp事件,然后使用MouseEventArgs的GetPosition(element),它返回相对于元素的坐标(有更多事件公开此方法)。

此外,利用RoutedEvent的OriginalSource来检查画布中的哪个元素被点击(在这种情况下,它只是矩形)。

以下是一个例子:

<Grid>
    <Canvas Name="MyCanvas" PreviewMouseLeftButtonDown="OnMouseDown" MouseMove="OnMouseMove">
        <Rectangle Width="20" Height="20" Canvas.Left="10" Canvas.Top="10" Fill="Blue"/>
        <Rectangle Width="20" Height="20" Canvas.Left="50" Canvas.Top="10" Fill="Red"/>
    </Canvas>
</Grid>

代码隐藏:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        AddHandler(Mouse.MouseUpEvent, new MouseButtonEventHandler(OnMouseUp), true);

    }

    private bool _isBeingDragged;

    public void OnMouseDown(object sender, MouseEventArgs args)
    {
        if (!(args.OriginalSource is Canvas))
        {
            _isBeingDragged = true;
        }
    }

    public void OnMouseMove(object sender, MouseEventArgs args)
    {
        if (_isBeingDragged)
        {
            var elementBeingDragged = (FrameworkElement) args.OriginalSource;
            var position = args.GetPosition(MyCanvas);
            Canvas.SetLeft(elementBeingDragged, position.X - elementBeingDragged.ActualWidth / 2);
            Canvas.SetTop(elementBeingDragged, position.Y - elementBeingDragged.ActualHeight / 2);                
        }
    }

    public void OnMouseUp(object sender, MouseEventArgs args)
    {
        _isBeingDragged = false;
    }

}

我必须使用UIElement的AddHandler方法注册MouseUp,因为它已被标记为Handled(AddHandler方法允许您为先前已处理的事件注册事件处理程序,ieeHandled = true)