2016-04-18 3 views
0


У меня здесь серьезная проблема.
У меня есть 4 TreeViews, и когда я перемещаю TreeViewItem с DnD внутри TreeView, все в порядке. Когда я перемещаю его из одного TreeView в другой, TreeViewItem добавляется дважды.
И теперь приходит любопытная вещь: Только когда я запускаю приложение в обычном режиме. Если я запустил его за один шаг, чтобы увидеть, что происходит, все работает так, как ожидалось, и элемент добавляется только один раз. Достаточно даже остановить его на первой строке OnDrop-Event, а затем позволить ему нормально работать. Затем он добавляется один раз, а не дважды.
Чтобы поставить «e.Handled = true» в OnDrop-Event, НЕ поможет.

Вот XAML:
Добавление TreeViewItem срабатывает дважды, но не за один шаг

<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]); 
    } 
} 

Любой любые идеи, которые могли бы быть?

ответ

0

Хорошо, одно решение, кажется, чтобы установить простой

if (!_isDragging) 
    return; 

Но мне интересно, в любом случае, почему я получить другой результат в одном шаге тестирования ...

Смежные вопросы