【WPF】Treeviewの引きずりを実現

10495 ワード

実現方法は2種類ある.方法1:イベントをリロードすることによって行われる参照項目ソース:http://files.cnblogs.com/ruicky/Wpf-TreeView-%E5%85%A8%E8%83%BD%E5%AE%9E%E7%8E%B0%E6%8B%96%E6%8B%BD.zipの利点:自分のプロジェクトに呼び出す方法が簡単である.勝手にドラッグする欠点:制限を追加しにくいノードでドラッグできない設定性が弱い2:Treeviewのイベントを書くことでドラッグする
フロント:


View Code
<TreeView Name="tvRequire"  BorderThickness="1"   



MouseDown="tvRequire_MouseDown" MouseMove="tvRequire_MouseMove" 



DragEnter="TheTreeView_CheckDropTarget" 



DragLeave="TheTreeView_CheckDropTarget" 



DragOver="TheTreeView_CheckDropTarget" Drop="tvRequire_Drop" >

   </TreeView>

バックグラウンド:


View Code
private Point _lastMouseDown;

        private void tvRequire_MouseDown(object sender, 



MouseButtonEventArgs e)

        {

            if (e.ChangedButton == MouseButton.Left)

            {

                _lastMouseDown = e.GetPosition(tvRequire);

            }

        }



 private void tvRequire_MouseMove(object sender, MouseEventArgs e)

        {

            if (e.LeftButton == MouseButtonState.Pressed)

            {

                Point currentPosition = e.GetPosition(tvRequire);

                if ((Math.Abs(currentPosition.X - 



_lastMouseDown.X) > 2.0) || (Math.Abs(currentPosition.Y - 



_lastMouseDown.Y) > 2.0))

                {

                    if ((tvRequire.SelectedItem as TreeViewItem) 



!= null)

                    {

                        DragDropEffects finalDropEffect = 



DragDrop.DoDragDrop(tvRequire.SelectedItem as TreeViewItem, 



sender, DragDropEffects.Move);



                    }

                }

            }

        }



private void TheTreeView_CheckDropTarget(object sender, 



DragEventArgs e)

        {

            

            if (e.Source as TreeViewItem != null)

            {

                if (!IsValidDropTarget((e.Source as 



TreeViewItem).Tag))

                {

                    e.Effects = DragDropEffects.None;

                }

            }

            e.Handled = true;

        }

//       

        private bool IsValidDropTarget(object id)

        {

            bool res = false;

            if (id != null)

            {

                

                //        

            }

            return res;

        }

  //Drop     

 private void tvRequire_Drop(object sender, DragEventArgs e)

        {

            TreeViewItem treeViewItemParent = new TreeViewItem();

            if (e.Source as EditableTextBlock != null)

            {

                treeViewItemParent = (e.Source as 



EditableTextBlock).Parent as TreeViewItem;//().Parent as 



TreeViewItem

                if (tvRequire.SelectedItem as TreeViewItem == 



(e.Source as EditableTextBlock).Parent as TreeViewItem)

                {

                    return;

                }

            }

            else

            {

                treeViewItemParent = e.Source as TreeViewItem;

                if (tvRequire.SelectedItem as TreeViewItem == 



e.Source as TreeViewItem)

                {

                    return;

                }

            }



            //        

            TreeViewItem itemRemoved = tvRequire.SelectedItem as 



TreeViewItem;

            CusRequireInfo cusRequireInfo = 



BLLCusRequire.GetModel(Convert.ToInt32(itemRemoved.Tag));

            if (cusRequireInfo.ParentId == 0)

            {

                tvRequire.Items.Remove(itemRemoved);

            }

            else

            {

                (itemRemoved.Parent as TreeViewItem).Items.Remove



(itemRemoved);

            }

            (treeViewItemParent).Items.Add(itemRemoved);



            cusRequireInfo.ParentId = Convert.ToInt32



(treeViewItemParent.Tag);

            BLLCusRequire.Update(cusRequireInfo);

        }

PS:主に3つの方法体tvRequireがあるMouseDown(座標の記録開始)tvRequire_MouseMove(ドラッグ効果操作を指定)TheTreeView_CheckDropTarget(ドラッグ可能かどうかを確認するために使用)tvRequire_Drop(ドラッグ後の保存用)
利点:カスタマイズ可能な制限ドラッグ条件、比較的理解しやすい欠点:コード量が多く、多重化率が低い
転載は出典を明記してください:http://www.cnblogs.com/ruicky/archive/2013/01/21/2869206.html