Перетаскивание между списком - PullRequest
1 голос
/ 03 июля 2019

Я хочу перетащить элемент между списком. Один находится в MainWindow, а другой в UserControl. Элементы управления вкладками динамически кодируются. ([VideoListing], [AddTab, AddItem]) Мне интересно, если это работает, а затем дать мне указания.

Это то, что я хотел. введите описание изображения здесь

И это мои коды

MainWindow.xaml

<TabControl x:Name="scenarioCB" ItemsSource="{Binding}" Grid.Row="1" HorizontalAlignment="Stretch" Margin="5,0,5,5"  VerticalAlignment="Stretch" SelectionChanged="ScenarioCB_SelectionChanged">
            <TabControl.ItemTemplate>
                <DataTemplate DataType="local:AddTab">
                    <TextBlock Text="{Binding Header}"/>
                </DataTemplate>
            </TabControl.ItemTemplate>
            <TabControl.ContentTemplate>
                <DataTemplate DataType="local:AddTab">
                    <ListBox x:Name="listBox" HorizontalAlignment="Stretch" Margin="0,0,0,0" VerticalAlignment="Stretch" ItemsSource="{Binding Data}" AllowDrop="True" Drop="ListBox_Drop" DragEnter="ListBox_DragEnter" ScrollViewer.VerticalScrollBarVisibility="Disabled" ScrollViewer.HorizontalScrollBarVisibility="Visible">
                        <ListBox.ItemsPanel>
                            <ItemsPanelTemplate>
                                <WrapPanel IsItemsHost="True"/>
                            </ItemsPanelTemplate>
                        </ListBox.ItemsPanel>
                        <ListBox.ItemTemplate>
                            <DataTemplate>
                                <StackPanel Orientation="Horizontal">
                                    <MediaElement Margin="3" Source="{Binding Path}" Height="64" Stretch="Uniform" IsMuted="True"/>
                                    <TextBlock Margin="3" Text="{Binding Name}"/>
                                </StackPanel>
                            </DataTemplate>
                        </ListBox.ItemTemplate>
                    </ListBox>
                </DataTemplate>
            </TabControl.ContentTemplate>
        </TabControl>

MainWindow.xaml.cs

var tabs = new ObservableCollection<AddTab>();
            for (int i = 0; i < DateListCount; i++)
            {
                var tab = new AddTab();
                tab = new AddTab() { Header = DateList[i] + " - " + TimeList[i] };
                tab.Data.Add(new AddData() { TIME = TimeList[i] });
                Console.WriteLine("i = {0}, Header = {1}, Time = {2}", i, DateList[i], TimeList[i]);
                tabs.Add(tab);
            }
            DataContext = tabs;

AddTab.cs

class AddTab
{
    public string Header { get; set; }
    public string Time { get; set; }
    public ObservableCollection<AddData> Data { get; } = new ObservableCollection<AddData>();
}

AddData.cs

class AddData
{
    public string NAME { get; set; }
    public string PATH { get; set; }
}

VideoPanel.xaml

<ListBox Grid.Row="0" x:Name="listBox" HorizontalAlignment="Stretch" Margin="0,0,0,0" VerticalAlignment="Stretch" AllowDrop="True" Drop="ListBox_Drop" DragEnter="ListBox_DragEnter" ScrollViewer.VerticalScrollBarVisibility="Visible" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
        <ListBox.ItemsPanel>
            <ItemsPanelTemplate>
                <WrapPanel IsItemsHost="True"/>
            </ItemsPanelTemplate>
        </ListBox.ItemsPanel>
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Vertical">
                    <MediaElement Margin="3" Source="{Binding Path}" Height="64" Stretch="Uniform" IsMuted="True"/>
                    <TextBlock Margin="3" Text="{Binding Name}"/>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

VideoPanel.xaml.cs

list.Add(new VideoListing()
            {
                Name = file_name,
                Path = file,
            });

VideoListing.cs

class VideoListing
{
    public string Name { get; set; }
    public string Path { get; set; }
}

Если у вас есть пример, пожалуйста, оставьте ссылку.

  • Перетаскивание между списками (MainWindow - UserControl)

  • Таблицы динамически кодируются

1 Ответ

0 голосов
/ 09 июля 2019

Я решил эту проблему.Использование DragDrop.DoDragDrop

Когда я запустил DragDrop.DoDragDrop (DependencyObject dragSourse, данные объекта, DragDropEffects allowEffects), когда я нажимал левую кнопку мыши.И когда я помещаю элемент в другой список, генерируется событие ListBox_Drop.В событии LisetBox_Drop просто извлеките данные из DragEventArgs.

Список - перетаскивание

private void ListBox_MouseMove(object sender, MouseEventArgs e)
    {
        DataObject dataObj = new DataObject();
        dynamic Booth = listBox.SelectedItem as dynamic;
        if (sender is ListBox && e.LeftButton == MouseButtonState.Pressed)
        {
            dataObj.SetData("Name", Booth.Name);
            dataObj.SetData("Path", Booth.Path);
            DragDrop.DoDragDrop(listBox, dataObj, DragDropEffects.Move);
        }
    }

Список - перетаскивание

private void ListBox_Drop(object sender, DragEventArgs e)
    {
        string name = (string)e.Data.GetData("Name");
        string path = (string)e.Data.GetData("Path");
    }
...