且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

在运行时拖动表格控件

更新时间:2023-12-06 14:57:16

在鼠标事件,您可以使用e.GetPosition来获得当前鼠标的位置,此功能可提供鼠标相对于特定元素的位置,也可以直接传递null。

In the Mouse event you can use e.GetPosition to get the current mouse position. This function can provide the mouse position relative to a specific element or you can just pass null.

下面是一个很简单的例子,没有命中测试或任何东西,只是一个按钮,你可以拖动。我用一个画布,以保持它短,但你可能会做更好的使用转换和转换控制到所需位置。

Here is a very simple example, no hit testing or anything, just a button that you can drag around. And I used a canvas to keep it short, but you would probably do better to use a transform and translate the control to the desired position.

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Canvas PreviewMouseLeftButtonDown="Canvas_PreviewMouseLeftButtonDown" 
            PreviewMouseMove="Canvas_PreviewMouseMove" 
            PreviewMouseLeftButtonUp="Canvas_PreviewMouseLeftButtonUp">
        <Button Name="dragButton" Width="80" Height="21" Canvas.Left="50" Canvas.Top="10">Drag Me!</Button>
    </Canvas>
</Window>





using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;

namespace WpfApplication1
{
  public partial class MainWindow : Window
  {
    public MainWindow()
    {
      InitializeComponent();      
    }    

    private Point _startPoint;
    private bool _dragging = false;

    private void Canvas_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {         
      if (dragButton.CaptureMouse())
      {        
        _startPoint = e.GetPosition(null);
        _dragging = true;        
      }
    }

    private void Canvas_PreviewMouseMove(object sender, MouseEventArgs e)
    {
      if (_dragging)
      {        
        Point newPoint = e.GetPosition(null);
        double dx = newPoint.X - _startPoint.X;
        double dy = newPoint.Y - _startPoint.Y;

        Canvas.SetLeft(dragButton, Canvas.GetLeft(dragButton) + dx);
        Canvas.SetTop(dragButton, Canvas.GetTop(dragButton) + dy);
        _startPoint = newPoint;
      }
    }

    private void Canvas_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {
      if (_dragging)
      {        
        _dragging = false;
        dragButton.ReleaseMouseCapture();
      }
    }    
  }
}