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