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;
但我想知道为什么我在单步测试中得到不同的结果