Многоуровневый шаблон дерева иерархических данных, поддерживающий перетаскивание нескольких элементов в WPF - PullRequest
0 голосов
/ 12 марта 2020

Я искал возможное решение в течение нескольких часов и не смог найти ни одного. Надеюсь, кто-нибудь сможет мне помочь. Я написал древовидное представление с шаблоном иерархических данных и написал перетаскивание для одного элемента, поэтому я хочу использовать многострочное перетаскивание. Также я установил «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);
        }
    }
}
...