65.9K
CodeProject 正在变化。 阅读更多。
Home

WPF TreeView 控件中的拖放功能

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.63/5 (21投票s)

2010年1月29日

CPOL

2分钟阅读

viewsIcon

177834

downloadIcon

22813

在 WPF TreeView 控件中实现拖放功能

引言

Windows Presentation Foundation (WPF) 是 .NET 3.0 中引入的一项新技术,名为 Avalon,它能够实现 Windows 程序视觉效果的丰富控制、设计和开发。WPF 应用程序既可以在桌面运行,也可以在 Web 浏览器上运行。

WPF 在控件之间的拖放操作中提供了很大的便利。 拖放相关的大部分工作已经完成,你只需要使用它们即可。

Using the Code

要在 WPF TreeView 控件中启用拖放功能,请按照以下步骤操作:

  1. TreeView 控件的属性 AllowDrop="True"
  2. TreeView 控件中声明三个事件,即“MouseDown”、“MouseMove”、“DragOver”和“Drop”事件。
  3.  <treeview.itemcontainerstyle>
    
        <style targettype="{x:Type TreeViewItem}">        
    <EventSetter Event="TreeViewItem.DragOver"  Handler="treeView_DragOver"/>
    <EventSetter Event="TreeViewItem.Drop" Handler="treeView_Drop"/>
    <EventSetter Event="TreeViewItem.MouseMove" Handler="treeView_MouseMove"/> 
    <EventSetter Event="TreeViewItem.MouseDown" Handler="treeView_MouseDown"/>
        </style>              
                    
     </treeview.itemcontainerstyle> 
  4. 在代码中实现以下事件:
    • MouseDown 事件
      private void TreeView_MouseDown
           (object sender, MouseButtonEventArgs e)
      {
          if (e.ChangedButton == MouseButton.Left)
          {
              _lastMouseDown = e.GetPosition(tvParameters);
          }
      }

      当按下任何鼠标按钮时,会发生此事件。 在此事件中,我们首先检查按钮是否按下,然后将鼠标位置保存到变量中(如果按下的是左键)。

    • MouseMove 事件
        private void treeView_MouseMove(object sender, MouseEventArgs e)
        {
              try
              {
                  if (e.LeftButton == MouseButtonState.Pressed)
                  {
                      Point currentPosition = e.GetPosition(tvParameters);
                      
                      if ((Math.Abs(currentPosition.X - _lastMouseDown.X) > 10.0) ||
                          (Math.Abs(currentPosition.Y - _lastMouseDown.Y) > 10.0))
                      {
                          draggedItem = (TreeViewItem)tvParameters.SelectedItem;
                          if (draggedItem != null)
                          {
                              DragDropEffects finalDropEffect = 
      			DragDrop.DoDragDrop(tvParameters, 
      				tvParameters.SelectedValue,
                                  DragDropEffects.Move);
                              //Checking target is not null and item is 
                              //dragging(moving)
                              if ((finalDropEffect == DragDropEffects.Move) && 
      				(_target != null))
                              {
                                  // A Move drop was accepted
                                  if (!draggedItem.Header.ToString().Equals
      				(_target.Header.ToString()))
                                  {
                                      CopyItem(draggedItem, _target);
                                      _target = null;
                                      draggedItem = null;
                                  }   
                              }
                          }
                      }
                  }
              }
            catch (Exception)
            {
            }
       }

      当鼠标移动时,会发生此事件。 首先,我们检查是否按下了左键。 然后检查鼠标移动的距离,如果它移出选定的 treeview 项之外,则检查拖放效果(如果已拖动)并将其拖放到 TreeViewItem (即目标不为 null)上,则将选定的项复制到拖放的项中。 在此事件中,你可以放置所需的 treeviewItem 下拉条件。

    • DragOver 事件
      private void treeView_DragOver(object sender, DragEventArgs e)
       {
          try
          {                   
              Point currentPosition = e.GetPosition(tvParameters);
            
       if ((Math.Abs(currentPosition.X - _lastMouseDown.X) >  10.0) ||
      	(Math.Abs(currentPosition.Y - _lastMouseDown.Y) > 10.0))
              {
                  // Verify that this is a valid drop and then store the drop target
                  TreeViewItem item = GetNearestContainer
      			(e.OriginalSource as UIElement);
                  if (CheckDropTarget(draggedItem, item))
                  {
                      e.Effects = DragDropEffects.Move;
                  }
                  else
                  {
                      e.Effects = DragDropEffects.None;
                  }
              }
              e.Handled = true;
          }
          catch (Exception)
          {
          }
      }

      当对象在拖放目标的边界内被拖动(移动)时,会发生此事件。 在这里,我们检查指针是否靠近 TreeViewItem ,如果靠近,则在其上设置拖放效果。

    • Drop 事件
        private void treeView_Drop(object sender, DragEventArgs e)
          {
              try
              {
                  e.Effects = DragDropEffects.None;
                  e.Handled = true;
                  
                  // Verify that this is a valid drop and then store the drop target
                  TreeViewItem TargetItem = GetNearestContainer
      				(e.OriginalSource as UIElement);
                  if (TargetItem != null && draggedItem != null )
                  {
                      _target = TargetItem;
                      e.Effects = DragDropEffects.Move;
                  }
              }
              catch (Exception)
              {
              }
         }

      当对象被拖放到 drop 目标上时,会发生此事件。 在这里,我们检查是否将拖放的项拖放到 TreeViewItem 上。 如果是,则将 drop 效果设置为无,并将目标项设置为变量。 然后 MouseMove 事件完成拖放操作。

关注点

我阅读了许多关于在 WPF 控件中启用拖放操作的文章和博客,最终我能够编写此代码。 我希望它能帮助你在 WPF TreeView 控件中启用拖放操作。

历史

  • 2010 年 1 月 29 日:初始发布
© . All rights reserved.