【问题标题】:Drag and drop Elements on a Canvas在画布上拖放元素
【发布时间】:2014-03-05 16:03:26
【问题描述】:

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

谁能给我一些代码,如何在运行时实现类似 onDrag 的东西?

【问题讨论】:

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


    【解决方案1】:

    您可以使用例如 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)

    【讨论】:

    • 这听起来很明智,但我的对象不动。定义 MouseDown 就够了吗?
    • 等等,出事了。但是现在它将元素设置为我“点击”的位置,它并不是真正可拖动的..
    • @user3351652 如果您尝试这个新版本,您会发现您可以拖动画布中的任何内容
    猜你喜欢
    • 2022-09-28
    • 2016-11-12
    • 1970-01-01
    • 2011-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多