У меня здесь серьезная проблема.
У меня есть 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]);
}
}
Любой любые идеи, которые могли бы быть?