C# 如何在运行时通过在WPF中使用拖放动态地将Listbox添加到包装面板

C# 如何在运行时通过在WPF中使用拖放动态地将Listbox添加到包装面板,c#,wpf,C#,Wpf,这是我的代码,右边有一个列表框,列表框项被添加到网格内的另一个列表框项中。通过使用关联菜单动态添加网格。直到它工作正常。但是现在我想在运行时将整个列表而不是列表项动态地移动到网格中。请任何人指导我拖动整个列表,并在运行时将整个列表动态放置到网格中 <Grid> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="*" />

这是我的代码,右边有一个列表框,列表框项被添加到网格内的另一个列表框项中。通过使用关联菜单动态添加网格。直到它工作正常。但是现在我想在运行时将整个列表而不是列表项动态地移动到网格中。请任何人指导我拖动整个列表,并在运行时将整个列表动态放置到网格中

  <Grid>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="Auto" />
        </Grid.ColumnDefinitions>
        <WrapPanel
            x:Name="mainPanel"
            Grid.Column="0"
            Background="#F0F0F0"
            ScrollViewer.VerticalScrollBarVisibility="Auto">
            <WrapPanel.ContextMenu>
                <ContextMenu>
                    <MenuItem Click="MenuItem_Click" Header="Add Pabel" />
                </ContextMenu>
            </WrapPanel.ContextMenu>
        </WrapPanel>

        <ListBox
            Name="memberCollection"
            Grid.Column="1"
            Width="150"
            HorizontalAlignment="Stretch"
            VerticalAlignment="Stretch"
            PreviewMouseLeftButtonDown="memberCollection_PreviewMouseLeftButtonDown">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel>
                        <Label Name="Name" Content="{Binding Name}" />
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Grid>
</Grid>

代码隐藏

ObservableCollection<Member> member = new ObservableCollection<Member>();

    public MainWindow()
    {
        InitializeComponent();

        member.Add(new Member { Name = "Karthick", ID = "20011", Address = "10, MainRoad, Chennai" });
        member.Add(new Member { Name = "Suresh", ID = "20012", Address = "11, MainRoad, Madurai" });
        member.Add(new Member { Name = "Arun", ID = "20013", Address = "12, MainRoad, Selam" });
        member.Add(new Member { Name = "Gokul", ID = "20014", Address = "13, MainRoad, Coimbature" });
        member.Add(new Member { Name = "Vishnu", ID = "20015", Address = "14, MainRoad, Goa" });

        memberCollection.ItemsSource = member;
    }

    private void MenuItem_Click(object sender, RoutedEventArgs e)
    {
        Grid panel = new Grid();
        panel.MinHeight = 150;
        panel.MinWidth = 150;
        panel.Height = 150;
        panel.Width = 150;
        panel.Margin = new Thickness(15,15,0,10);

        Grid gridDrop = new Grid()
        {
            Background = Brushes.White,
            HorizontalAlignment = HorizontalAlignment.Stretch,
            VerticalAlignment = VerticalAlignment.Stretch                
        };

        gridDrop.Drop += grid_Drop;

        var panelTemplate = new DataTemplate();            
        var stackPanel = new FrameworkElementFactory(typeof(StackPanel));
        stackPanel.SetValue(StackPanel.OrientationProperty, Orientation.Vertical);            

        var name = new FrameworkElementFactory(typeof(Label));            
        name.SetBinding(Label.ContentProperty, new Binding("Name"));
        var id = new FrameworkElementFactory(typeof(Label));
        id.SetBinding(Label.ContentProperty, new Binding("ID"));
        var address = new FrameworkElementFactory(typeof(Label));
        address.SetBinding(Label.ContentProperty, new Binding("Address"));
        stackPanel.AppendChild(name);
        stackPanel.AppendChild(id);
        stackPanel.AppendChild(address);

        panelTemplate.VisualTree = stackPanel;            

        ListBox listBox = new ListBox()
        {
            AllowDrop = true,
            ItemTemplate = panelTemplate
        };         

        gridDrop.Children.Add(listBox);
        panel.Children.Add(gridDrop);
        mainPanel.Children.Add(panel);

        DataContext = new Member();
    }       

    private void memberCollection_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        object selectedMember = memberCollection.SelectedItem as Member;
        if (selectedMember != null)
        {
            DragDrop.DoDragDrop(memberCollection, selectedMember, DragDropEffects.Move);                
        }
    }

    private void grid_Drop(object sender, RoutedEventArgs e)
    {
        ListBox listContent = e.Source as ListBox;
        if (listContent != null)
            Console.WriteLine("", Grid.GetColumn(listContent), Grid.GetRow(listContent));

        DataObject item = (((DragEventArgs)e).Data) as DataObject;

        object Target = ((Grid)(sender)).DataContext;

        if (Target != null)
        {
            object listItem = item.GetData(Target.GetType());
            listContent.Items.Add(listItem);
        }                                        
    }
ObservableCollection成员=新的ObservableCollection();
公共主窗口()
{
初始化组件();
添加(新成员{Name=“karthigh”,ID=“20011”,Address=“10,钦奈大道”});
添加(新成员{Name=“Suresh”,ID=“20012”,Address=“11,MainRoad,Madurai”});
添加(新成员{Name=“Arun”,ID=“20013”,Address=“12,mainload,Selam”});
添加(新成员{Name=“Gokul”,ID=“20014”,Address=“13,mainload,Coimbature”});
添加(新成员{Name=“Vishnu”,ID=“20015”,Address=“14,缅因路,果阿”});
memberCollection.ItemsSource=成员;
}
私有无效菜单项单击(对象发送方,路由目标)
{
网格面板=新网格();
面板最小高度=150;
面板最小宽度=150;
面板高度=150;
面板宽度=150;
面板边缘=新厚度(15,15,0,10);
Grid gridDrop=new Grid()
{
背景=画笔。白色,
水平对齐=水平对齐。拉伸,
垂直对齐=垂直对齐。拉伸
};
gridDrop.Drop+=网格_Drop;
var panelTemplate=新数据模板();
var stackPanel=新的frameworkelement工厂(typeof(stackPanel));
stackPanel.SetValue(stackPanel.OrientationProperty,Orientation.Vertical);
变量名称=新FrameworkElementFactory(类型(标签));
name.SetBinding(Label.ContentProperty,新绑定(“名称”));
var id=新FrameworkElementFactory(类型(标签));
id.SetBinding(Label.ContentProperty,新绑定(“id”);
var地址=新FrameworkElementFactory(类型(标签));
address.SetBinding(Label.ContentProperty,新绑定(“地址”);
stackPanel.AppendChild(名称);
stackPanel.AppendChild(id);
stackPanel.AppendChild(地址);
panelTemplate.VisualTree=stackPanel;
ListBox ListBox=新建ListBox()
{
AllowDrop=true,
ItemTemplate=panelTemplate
};         
gridDrop.Children.Add(列表框);
panel.Children.Add(gridDrop);
主面板.Children.Add(面板);
DataContext=新成员();
}       
私有void memberCollection\u PreviewMouseLeftButtonDown(对象发送器,鼠标按钮ventargs e)
{
对象selectedMember=memberCollection.SelectedItem作为成员;
如果(selectedMember!=null)
{
DragDrop.DoDragDrop(memberCollection、selectedMember、DragDropEffects.Move);
}
}
专用无效网格(对象发送器,路由目标e)
{
ListBox listContent=e.源为ListBox;
if(listContent!=null)
Console.WriteLine(“,Grid.GetColumn(listContent),Grid.GetRow(listContent));
数据对象项=((DragEventArgs)e).Data)作为数据对象;
对象目标=((网格)(发送方)).DataContext;
如果(目标!=null)
{
object listItem=item.GetData(Target.GetType());
listContent.Items.Add(listItem);
}                                        
}

如果您只想移动整个列表并为每个
成员创建一个互动程序,那么这是一种方法:

首先,您应该简化模板并将其放入XAML中。 XAML在处理任何类型的模板时都比代码隐藏更有效

对于左侧主面板:

        <ItemsControl x:Name="mainPanel" Grid.Column="0" ItemsSource="{Binding}">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapPanel Background="#F0F0F0"  AllowDrop="True"  Drop="mainPanel_Drop">
                        <WrapPanel.ContextMenu>
                            <ContextMenu>
                                <MenuItem Click="MenuItem_Click" Header="Add Panel" />
                            </ContextMenu>
                        </WrapPanel.ContextMenu>
                    </WrapPanel>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Vertical" Background="White"  AllowDrop="True" Margin="15,15,0,10" Width="150" MinWidth="150" Height="150" MinHeight="150">
                        <Label Content="{Binding Name}"/>
                        <Label Content="{Binding ID}"/>
                        <Label Content="{Binding Address}"/>
                    </StackPanel>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
如果要复制整个列表,则必须将整个ObservableCollection提供给DragDrop管理器:

    private void memberCollection_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        object collectionDataContext = memberCollection.DataContext;
        if (collectionDataContext != null)
        {
            DataObject dragData = new DataObject("DataContext", collectionDataContext);
            DragDrop.DoDragDrop(memberCollection, dragData, DragDropEffects.Move);
        }
    }
当您删除它时,您可以简单地逐个添加成员。您也可以在之前清除集合(但我没有):

private void主面板_Drop(对象发送器,DragEventArgs e)
{
数据对象项=e.数据作为数据对象;
对象listItem=item.GetData(“DataContext”)作为IEnumerable;
如果(listItem!=null)
{
foreach(在(IEnumerable)列表项中的成员)
{
((ObservableCollection)mainPanel.DataContext).Add(成员);
}
}
}
我不太清楚你想要什么。。。我仍然不知道你是如何使用瓷砖创建的。
如果您需要做一些不同的事情,请告诉我。

问题是什么?您好。看一看,如果你有任何问题或疑问,请回来。我们很乐意帮助您,但我们无法为您编写代码;)@鲍勃,请参考我的更新代码。好的,很好。最后一个问题:是否要将整个右侧列表
memberCollection
移动到一个磁贴中?还是要为右侧列表中的每个成员自动创建平铺?我真的不明白为什么互动程序应该包含
成员的列表
谢谢你的回复@Bob,我想把整个列表移到主面板中
    ObservableCollection<Member> member = new ObservableCollection<Member>();
    ObservableCollection<Member> mainPanelMembers = new ObservableCollection<Member>();

    public MainWindow()
    {
        InitializeComponent();

        member.Add(new Member { Name = "Karthick", ID = "20011", Address = "10, MainRoad, Chennai" });
        member.Add(new Member { Name = "Suresh", ID = "20012", Address = "11, MainRoad, Madurai" });
        member.Add(new Member { Name = "Arun", ID = "20013", Address = "12, MainRoad, Selam" });
        member.Add(new Member { Name = "Gokul", ID = "20014", Address = "13, MainRoad, Coimbature" });
        member.Add(new Member { Name = "Vishnu", ID = "20015", Address = "14, MainRoad, Goa" });

        memberCollection.DataContext = member;
        mainPanel.DataContext = mainPanelMembers;
    }
private void MenuItem_Click(object sender, RoutedEventArgs e)
{
    mainPanelMembers.Add(new Member());
}
    private void memberCollection_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        object collectionDataContext = memberCollection.DataContext;
        if (collectionDataContext != null)
        {
            DataObject dragData = new DataObject("DataContext", collectionDataContext);
            DragDrop.DoDragDrop(memberCollection, dragData, DragDropEffects.Move);
        }
    }
    private void mainPanel_Drop(object sender, DragEventArgs e)
    {
        DataObject item = e.Data as DataObject;
        object listItem = item.GetData("DataContext") as IEnumerable<Member>;

        if (listItem != null)
        {
            foreach (Member member in (IEnumerable<Member>)listItem)
            {
                ((ObservableCollection<Member>)mainPanel.DataContext).Add(member);
            }

        }
    }