为了账号安全,请及时绑定邮箱和手机立即绑定

如何在运行时使用 WPF 中的拖放将列表框动态添加到 Wrap 面板

如何在运行时使用 WPF 中的拖放将列表框动态添加到 Wrap 面板

C#
蝴蝶不菲 2021-10-09 16:08:40
这是我的代码,右侧有一个列表框,列表框项被添加到网格内的另一个列表框项中。使用上下文菜单动态添加网格。直到它工作正常。但是现在我想在运行时将整个列表而不是列表项动态移动到网格。请任何人指导我拖动整个列表并在运行时将整个列表动态放置到网格中。  <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>
查看完整描述

1 回答

?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

如果您只想移动整个列表并为每个创建一个磁贴Member,那么这是一种方法:


首先,您应该简化您的模板并将其放入 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>

对于您的列表(没有太大变化)


        <ListBox

        Name="memberCollection"

        Grid.Column="1"

        Width="150"

        HorizontalAlignment="Stretch"

        VerticalAlignment="Stretch"

        ItemsSource="{Binding}"

        PreviewMouseLeftButtonDown="memberCollection_PreviewMouseLeftButtonDown">

            <ListBox.ItemTemplate>

                <DataTemplate>

                    <StackPanel>

                        <Label Name="memberName" Content="{Binding Name}" />

                    </StackPanel>

                </DataTemplate>

            </ListBox.ItemTemplate>

        </ListBox>

我添加了两个 ObservableCollection 来管理数据


    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;

    }

然后,创建一个新的 Tile 就简单多了:


private void MenuItem_Click(object sender, RoutedEventArgs e)

{

    mainPanelMembers.Add(new Member());

}

如果要复制整个列表,则必须将整个 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 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);

            }


        }

    }

我不确定我是否完全理解你想要什么......我仍然不知道你是如何使用 Tile 创建的。如果您需要做一些不同的事情,请告诉我。


查看完整回答
反对 回复 2021-10-09
  • 1 回答
  • 0 关注
  • 223 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信