C# 添加TreeViewItem会触发两次,但不是一步触发
C# 添加TreeViewItem会触发两次,但不是一步触发,c#,wpf,xaml,treeview,C#,Wpf,Xaml,Treeview,我这里有个严重的问题。 我有4个TreeView,当我在TreeView中移动带有DnD的TreeView项目时,一切都很好。当我将它从一个树状视图移动到另一个树状视图时,会添加两次树状视图项。 现在奇怪的事情来了:只有当我正常运行应用程序时。如果我一步一步地运行它,看看会发生什么,一切都会按预期进行,并且只添加一次项。甚至可以在OnDrop事件的第一行停止它,然后让它正常运行。然后只添加一次,而不是两次。在OnDrop事件中添加“e.Handled=true”没有帮助。以下是XAML: <
我这里有个严重的问题。
我有4个TreeView,当我在TreeView中移动带有DnD的TreeView项目时,一切都很好。当我将它从一个树状视图移动到另一个树状视图时,会添加两次树状视图项。
现在奇怪的事情来了:只有当我正常运行应用程序时。如果我一步一步地运行它,看看会发生什么,一切都会按预期进行,并且只添加一次项。甚至可以在OnDrop事件的第一行停止它,然后让它正常运行。然后只添加一次,而不是两次。
在OnDrop事件中添加“e.Handled=true”没有帮助。
以下是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代码: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]);
}
}
private void TreeView\u OnDrop(对象发送方,DragEventArgs e)
{
_IsDraging=错误;
_dragTimer.Stop();
if(e.Source.GetType()==typeof(TreeView))
返回;
TreeViewItem sourceItem=(TreeViewItem)e.Data.GetData(“System.Windows.Controls.TreeViewItem”);
TreeViewItem sourceParentItem=(TreeViewItem)sourceItem.Parent;
TreeView sourceTreeView=GetTreeView(sourceItem);
TreeViewItem targetItem=(TreeViewItem)e.源;
TreeViewItem targetParentItem=GetParentTreeViewItem(targetItem);
TreeView targetTreeView=GetTreeView(targetItem);
if(ReferenceEquals(sourceParentItem,targetItem)| | ReferenceEquals(sourceItem,targetItem)|
sourceTreeView.Name.Equals(“MarketingScreenTreeView”)&&!targetTreeView.Name.Equals(“MarketingScreenTreeView”))
返回;
if(targetItem.Tag.Equals(“sortObject”))
{
如果(!sourceItem.Tag.Equals(“screenObject”)| |!Equals(sourceTreeView,targetTreeView))
返回;
sourceParentItem.Items.Remove(sourceItem);
targetItem.Items.Add(sourceItem);
sourceItem.IsSelected=true;
返回;
}
if(targetItem.Tag.Equals(“screenObject”))
{
if(sourceItem.Tag.Equals(“屏幕对象”)&&Equals(sourceTreeView,targetTreeView))
MoveTreeViewItem(sourceParentItem、sourceItem、targetParentItem、targetItem、e);
如果(!sourceItem.Tag.Equals(“screenObject”))
{
if(等于(sourceTreeView、targetTreeView))
{
sourceParentItem.Items.Remove(sourceItem);
targetItem.Items.Add(sourceItem);
}
else if(targetTreeView.Name.Equals(“MarketingScreenTreeView”))
{
TreeViewItem newItem=新的TreeViewItem
{
Header=sourceItem.Header,
Tag=sourceItem.Tag
};
newItem.Selected+=TreeViewItemOnSelected;
targetItem.Items.Add(新建项);
}
}
返回;
}
if(sourceItem.Tag.Equals(“screenObject”))
返回;
MoveTreeViewItem(sourceParentItem、sourceItem、targetParentItem、targetItem、e);
}
私有静态树视图GetTreeView(FrameworkElement sourceItem)
{
while(true)
{
if(sourceItem.Parent.GetType()==typeof(TreeViewItem))
sourceItem=(TreeViewItem)sourceItem.Parent;
其他的
return(TreeView)sourceItem.Parent;
}
}
私有void MoveTreeViewItem(TreeViewItem sourceParentItem、TreeViewItem sourceItem、,
TreeViewItem targetParentItem、TreeViewItem targetItem、DragEventArgs e)
{
TreeViewItem copyItem;
TreeView sourceTreeView=GetTreeView(sourceItem);
TreeView targetTreeView=GetTreeView(targetItem);
if(等于(sourceTreeView、targetTreeView))
{
sourceParentItem.Items.Remove(sourceItem);
copyItem=sourceItem;
}
其他的
{
copyItem=新树视图项
{
Header=sourceItem.Header,
Tag=sourceItem.Tag
};
如果(!copyItem.Tag.Equals(“screenObject”))
copyItem.Selected+=TreeViewItemOnSelected;
}
列出allChildItems=targetParentItem.Items.Cast().ToList();
点鼠标点=e.GetPosition(targetItem);
int-listPosition;
如果(鼠标点Y<8)/(targetItem.ActualHeight/2))
listPosition=targetParentItem.Items.IndexOf(targetItem);
其他的
listPosition=targetParentItem.Items.IndexOf(targetItem)+1;
targetParentItem.Items.Clear();
bool itemFound=false;
对于(inti=0;iOk),一个解决方案似乎是设置一个简单的
if (!_isDragging)
return;
但我想知道为什么我在单步测试中得到不同的结果