3

我有带有拖放实现的 WPF 应用程序...每当我在 a 上拖动树项时,Grid它都会由DragDropEvent处理Grid,但是每次它被触发两次时,可能是什么原因?

下面是在 a 上实现拖放的代码TreeView

 void treeViewGroups_MouseMove(object sender, MouseEventArgs e)
 {
   try
   {
     if (e.LeftButton == System.Windows.Input.MouseButtonState.Pressed)
     {
        Point position = e.GetPosition(null);
        if (Math.Abs(position.X - this.startPoint.X) > SystemParameters.MinimumHorizontalDragDistance || Math.Abs(position.Y - this.startPoint.Y) > SystemParameters.MinimumVerticalDragDistance)
        {
          DataRowView treeViewItem = this.treeViewGroups.SelectedItem as DataRowView;
          if (treeViewItem != null)
          if ((treeViewItem.Row.Table.TableName == "TableGroup"))
          {
             ViewTaxSCConstants.dragElement = treeViewItem;
             Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Render, new System.Threading.ParameterizedThreadStart(DoDragDrop), treeViewItem);                                
           }
        }
     }
}
4

2 回答 2

3

我遇到了几乎相同的问题:我在 MouseMove 上启动了拖动事件,并在某些 TreeViewItems 上有了一个放置事件。在第一次触发 drop 事件后,它会再次触发,但目标将是不同的元素(在我的情况下,是我的目标的父元素)。

为了解决这个问题,我不得不设置e.Handled = trueDrop 事件。

于 2015-05-11T14:56:43.567 回答
-1

我认为这是拖放的好方法

darg 和 drop 的一个好方法被解释为

将拖动检测为 MouseMove 和 MouseLeftButtonDown 的组合

找到您要拖动的数据并创建一个包含格式、数据和允许效果的 DataObject。

通过调用 DoDragDrop() 启动拖动

在要允许放置的元素上将 AllowDrop 属性设置为 True。

将处理程序注册到 DragEnter 事件以检测拖放位置上的拖动。通过在事件参数上调用 GetDataPresent() 检查格式和数据。如果可以删除数据,请在事件 args 上设置 Effect 属性以显示适当的鼠标光标。

当用户释放鼠标按钮时,将调用 DragDrop 事件。通过在事件 args 中提供的 Data 对象上调用 GetData() 方法来获取数据。

你可以在这里找到完整的文章

于 2009-09-08T11:36:24.967 回答