Я искал возможное решение в течение нескольких часов и не смог найти ни одного. Надеюсь, кто-нибудь сможет мне помочь. Я написал древовидное представление с шаблоном иерархических данных и написал перетаскивание для одного элемента, поэтому я хочу использовать многострочное перетаскивание. Также я установил «Install-Package MultiSelectTreeView -Version 1.0.9». Как добавить древовидное представление, поддерживающее множественный выбор, с помощью перетаскивания нескольких элементов в мое приложение WPF?
XAML:
<TreeView Name="tvMain" FontSize="14" Grid.Row="2" Background="#FFF9F9F9" AllowDrop="True" PreviewMouseLeftButtonDown="TreeViewItem_PreviewMouseLeftButtonDown"
PreviewMouseMove="TreeViewItem_PreviewMouseMove" SelectedItemChanged="tvMain_SelectedItemChanged">
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<EventSetter Event="MouseDoubleClick" Handler="TreeView_MouseDoubleClick" />
<EventSetter Event="MouseRightButtonDown" Handler="TreeView_MouseRightClick" />
</Style>
</TreeView.ItemContainerStyle>
<TreeView.ItemTemplate>
<HierarchicalDataTemplate >
<StackPanel Orientation="Horizontal">
<Image Margin="2" Width="14" Height="14" Source="{Binding Path=ImageUrl}" HorizontalAlignment="Right" VerticalAlignment="Center" ></Image>
<TextBlock Margin="2" Text="{Binding Path=Name}" MinWidth="280" Width="{Binding Path=SizeOfName}" VerticalAlignment="Center" />
<TextBlock Name="lb_params" Text="{Binding Params}" Width="{Binding Path=SizeParams}" VerticalAlignment="Center" TextAlignment="Center"/>
</StackPanel>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
Я использовал методы на этом сайте для общего перетаскивания. C#:
Point startPoint;
private void TreeViewItem_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
startPoint = e.GetPosition(null);
}
private void TreeViewItem_PreviewMouseMove(object sender, MouseEventArgs e)
{
Point mousePos = e.GetPosition(null);
Vector diff = startPoint - mousePos;
if (e.LeftButton == MouseButtonState.Pressed && (Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance || Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance))
{
TreeView treeView = sender as TreeView;
if (treeView.SelectedItem != null)
{
DataObject dragData = new DataObject("myFormat", treeView.SelectedItem);
DragDrop.DoDragDrop(treeView, dragData, DragDropEffects.Move);
}
}
}