我在这里遇到了严重的问题
我有4个TreeViews,当我在TreeView中移动带有DnD的TreeViewItem时,一切都很好。当我将它从一个TreeView移动到另一个TreeView时,TreeViewItem被添加两次
现在出现了奇怪的事情:只有当我正常运行应用程序时。如果我一步一步地运行它,看看会发生什么,一切都按预期工作,而Item只添加一次。甚至可以在OnDrop-Event的第一行停止它,然后让它正常运行。然后它只添加一次,而不是两次。
放一个" e.Handled = true"在OnDrop-Event中没有帮助。
这是XAML:
<Style x:Key="LibraryTreeViewItemStyle" TargetType="{x:Type TreeViewItem}">
<Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />
<Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
<Setter Property="FontWeight" Value="Normal" />
</Style>
<TreeView Name="MarketingScreenTreeView" Height="800"
SelectedItemChanged="TreeView_OnSelectedItemChanged"
PreviewMouseLeftButtonDown="MarketingScreenTreeView_OnPreviewMouseLeftButtonDown"
PreviewMouseMove="TreeView_OnPreviewMouseMove"
AllowDrop="True" PreviewDragOver="TreeView_OnPreviewDragOver"
Drop="TreeView_OnDrop"
ItemContainerStyle="{StaticResource LibraryTreeViewItemStyle}" />
这是cs-Code:
private void TreeView_OnDrop(object sender, DragEventArgs e)
{
_isDragging = false;
_dragTimer.Stop();
if (e.Source.GetType() == typeof(TreeView))
return;
TreeViewItem sourceItem = (TreeViewItem) e.Data.GetData("System.Windows.Controls.TreeViewItem");
TreeViewItem sourceParentItem = (TreeViewItem) sourceItem.Parent;
TreeView sourceTreeView = GetTreeView(sourceItem);
TreeViewItem targetItem = (TreeViewItem) e.Source;
TreeViewItem targetParentItem = GetParentTreeViewItem(targetItem);
TreeView targetTreeView = GetTreeView(targetItem);
if (ReferenceEquals(sourceParentItem, targetItem) || ReferenceEquals(sourceItem, targetItem) ||
sourceTreeView.Name.Equals("MarketingScreenTreeView") && !targetTreeView.Name.Equals("MarketingScreenTreeView"))
return;
if (targetItem.Tag.Equals("sortObject"))
{
if (!sourceItem.Tag.Equals("screenObject") || !Equals(sourceTreeView, targetTreeView))
return;
sourceParentItem.Items.Remove(sourceItem);
targetItem.Items.Add(sourceItem);
sourceItem.IsSelected = true;
return;
}
if (targetItem.Tag.Equals("screenObject"))
{
if (sourceItem.Tag.Equals("screenObject") && Equals(sourceTreeView, targetTreeView))
MoveTreeViewItem(sourceParentItem, sourceItem, targetParentItem, targetItem, e);
else if (!sourceItem.Tag.Equals("screenObject"))
{
if (Equals(sourceTreeView, targetTreeView))
{
sourceParentItem.Items.Remove(sourceItem);
targetItem.Items.Add(sourceItem);
}
else if(targetTreeView.Name.Equals("MarketingScreenTreeView"))
{
TreeViewItem newItem = new TreeViewItem
{
Header = sourceItem.Header,
Tag = sourceItem.Tag
};
newItem.Selected += TreeViewItemOnSelected;
targetItem.Items.Add(newItem);
}
}
return;
}
if (sourceItem.Tag.Equals("screenObject"))
return;
MoveTreeViewItem(sourceParentItem, sourceItem, targetParentItem, targetItem, e);
}
private static TreeView GetTreeView(FrameworkElement sourceItem)
{
while (true)
{
if (sourceItem.Parent.GetType() == typeof (TreeViewItem))
sourceItem = (TreeViewItem) sourceItem.Parent;
else
return (TreeView) sourceItem.Parent;
}
}
private void MoveTreeViewItem(TreeViewItem sourceParentItem, TreeViewItem sourceItem,
TreeViewItem targetParentItem, TreeViewItem targetItem, DragEventArgs e)
{
TreeViewItem copyItem;
TreeView sourceTreeView = GetTreeView(sourceItem);
TreeView targetTreeView = GetTreeView(targetItem);
if (Equals(sourceTreeView, targetTreeView))
{
sourceParentItem.Items.Remove(sourceItem);
copyItem = sourceItem;
}
else
{
copyItem = new TreeViewItem
{
Header = sourceItem.Header,
Tag = sourceItem.Tag
};
if(!copyItem.Tag.Equals("screenObject"))
copyItem.Selected += TreeViewItemOnSelected;
}
List<TreeViewItem> allChildItems = targetParentItem.Items.Cast<TreeViewItem>().ToList();
Point mousePoint = e.GetPosition(targetItem);
int listPosition;
if (mousePoint.Y < 8) //(targetItem.ActualHeight / 2))
listPosition = targetParentItem.Items.IndexOf(targetItem);
else
listPosition = targetParentItem.Items.IndexOf(targetItem) + 1;
targetParentItem.Items.Clear();
bool itemFound = false;
for (int i = 0; i <= allChildItems.Count; i++)
{
if (i == listPosition)
{
targetParentItem.Items.Add(copyItem);
itemFound = true;
}
else if (itemFound)
targetParentItem.Items.Add(allChildItems[i - 1]);
else
targetParentItem.Items.Add(allChildItems[i]);
}
}
任何想法都可以吗?
答案 0 :(得分:0)
好的,一个解决方案似乎是设置一个简单的
if (!_isDragging)
return;
但我不知道为什么我在单步测试中得到不同的结果......