添加TreeViewItem会触发两次,但不会单步执行

时间:2016-04-18 09:05:11

标签: c# wpf xaml treeview

我在这里遇到了严重的问题 我有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]);
    }
}

任何想法都可以吗?

1 个答案:

答案 0 :(得分:0)

好的,一个解决方案似乎是设置一个简单的

if (!_isDragging)
    return;

但我不知道为什么我在单步测试中得到不同的结果......