【问题标题】:How to remove or add an item from a WrapPanel?如何从 WrapPanel 中删除或添加项目?
【发布时间】:2011-01-06 20:53:30
【问题描述】:

我正在尝试创建一个原型,用户可以通过选择菜单项来显示或显示项目。我需要删除/折叠该项目,因为我需要 WrapPanel 中的其他项目占用空白空间。 wrapPanel 中的内容是使用 XMLDataProvider 动态生成的。我试图为菜单项分配命令,但无法使其工作。

XAML:

<Grid Margin="20">  
    <Menu x:Name="Manage_Menu" HorizontalAlignment="Left" Background="{x:Null}" ScrollViewer.VerticalScrollBarVisibility="Auto" Foreground="#FF2A2A2A" Margin="0,0,0,5" >
        <MenuItem Header="Show/Hide">
                  <MenuItem Header="1" Command="{x:Static local:MainWindow.FirstThumbVisibilityWindowCommand}" IsCheckable="true" IsChecked="True"/>
                  <MenuItem Header="2" Command="{x:Static local:MainWindow.FirstThumbVisibilityWindowCommand}" IsCheckable="true" />
                  <MenuItem Header="3" Command="{x:Static local:MainWindow.FirstThumbVisibilityWindowCommand}" IsCheckable="true" />
                  <MenuItem Header="4" Command="{x:Static local:MainWindow.FirstThumbVisibilityWindowCommand}" IsCheckable="true" />
                  <MenuItem Header="5" Command="{x:Static local:MainWindow.FirstThumbVisibilityWindowCommand}" IsCheckable="true" />
        </MenuItem>
    </Menu>
    <Frame Content="Frame" Source="../tiles.xaml" NavigationUIVisibility="Hidden" />
</Grid> 

我希望有人能够提供帮助。 整个解决方案可从此处获得:

http://cid-0c29483cf3a6a14d.office.live.com/self.aspx/WPF%5E_Tests/DragDropWrapPanel%5E_3.rar

请看一看。您会在左上角找到菜单,该菜单应用于隐藏/显示 wrapPanel 内的项目。 提前谢谢你。

【问题讨论】:

  • 仅供参考 - 人们不太可能下载和调试您的项目。相反,您需要使用适当的代码段来形成一个详细的问题,其中包含有关您尝试做什么的足够具体信息。您更有可能得到适合您问题的答案。

标签: wpf wpf-controls binding


【解决方案1】:

从包装面板中添加或删除项目的一种方法是使用 ListBox 并将 ItemsPanel 配置为 WrapPanel

<ListBox.ItemsPanel>
    <ItemsPanelTemplate>
        <WrapPanel />
    </ItemsPanelTemplate>
</ListBox.ItemsPanel>

将 ListBox 绑定到 ObservableCollection,然后从绑定的集合中添加和删除视图模型。

【讨论】:

  • 如果他们不想要选择支持,也许是ItemsControl 而不是ListBox
  • ItemsControl 适用于您不希望进行选择或 ListBox 可以设置为不显示任何选择效果的样式。
  • 我链接到的解决方案是这样构建的,但仍然无法正常工作。
【解决方案2】:

这是一个从代码更改 WrapPanel 项目可见性的示例。

一些示例 XAML:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <StackPanel Grid.Row="0" Orientation="Horizontal">
        <Button Content="0" Click="Button_Click"/>
        <Button Content="1" Click="Button_Click"/>
        <Button Content="2" Click="Button_Click"/>
    </StackPanel>
    <WrapPanel Grid.Row="1" x:Name="wrapPanel">
        <Rectangle Fill="Red" Width="100" Height="100"/>
        <Rectangle Fill="Green" Width="100" Height="100"/>
        <Rectangle Fill="Blue" Width="100" Height="100"/>
    </WrapPanel>
</Grid>

和按钮事件处理程序:

private void Button_Click(object sender, RoutedEventArgs e)
{
    int index = int.Parse((string)((sender as Button).Content));
    var child = this.wrapPanel.Children[index];
    child.Visibility = child.Visibility == Visibility.Visible ? Visibility.Collapsed : Visibility.Visible;
}

它只是根据按钮上的文本切换子项的可见性。

【讨论】:

  • 这是我想要实现的东西。不幸的是,我还没有成功。我想知道您是否不介意查看您可以在此处找到的解决方案:cid-0c29483cf3a6a14d.office.live.com/self.aspx/WPF%5E_Tests/…,现在让我知道我能做什么。提前谢谢你。
  • 您的提案更改了可见性,但不可见,空白空间仍然存在,其他项目不占用空白空间。
【解决方案3】:

这里是一个仅是 XAML 的 quick-n-dirty 版本。它使用内置的 BooleanToVisibilityConverter 和 Element 绑定。

<Window x:Class="WrapPanelHideItems.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="WrapPanelHideItems" Height="300" Width="300">

    <Window.Resources>
        <BooleanToVisibilityConverter x:Key="boolToVis" />
    </Window.Resources>

    <StackPanel>
        <Menu>
            <MenuItem Header="Show/Hide">
                <MenuItem x:Name="mnuItemOne"
                          IsCheckable="True"
                          IsChecked="True"
                          Header="Show Item One" />
                <MenuItem x:Name="mnuItemTwo"
                          IsCheckable="True"
                          IsChecked="True"
                          Header="Show Item Two" />
                <MenuItem x:Name="mnuItemThree"
                          IsCheckable="True"
                          IsChecked="True"
                          Header="Show Item Three" />
                <MenuItem x:Name="mnuItemFour"
                          IsCheckable="True"
                          IsChecked="True"
                          Header="Show Item Four" />
                <MenuItem x:Name="mnuItemFive"
                          IsCheckable="True"
                          IsChecked="True"
                          Header="Show Item Five" />
            </MenuItem>
        </Menu>

        <WrapPanel Orientation="Horizontal"
                   HorizontalAlignment="Stretch"
                   VerticalAlignment="Stretch"
                   Background="Gray">
            <TextBlock Text="Item One"
                       Margin="5"
                       FontSize="25"
                       Foreground="Red"
                       Visibility="{Binding ElementName=mnuItemOne, Path=IsChecked,
                                            Converter={StaticResource boolToVis}}"/>
            <TextBlock Text="Item Two"
                       Margin="5"
                       FontSize="25"
                       Foreground="Blue"
                       Visibility="{Binding ElementName=mnuItemTwo, Path=IsChecked,
                                            Converter={StaticResource boolToVis}}"/>
            <TextBlock Text="Item Three"
                       Margin="5"
                       FontSize="25"
                       Foreground="Green"
                       Visibility="{Binding ElementName=mnuItemThree, Path=IsChecked,
                                            Converter={StaticResource boolToVis}}"/>
            <TextBlock Text="Item Four"
                       Margin="5"
                       FontSize="25"
                       Foreground="Yellow"
                       Visibility="{Binding ElementName=mnuItemFour, Path=IsChecked,
                                            Converter={StaticResource boolToVis}}"/>
            <TextBlock Text="Item Five"
                       Margin="5"
                       FontSize="25"
                       Foreground="Violet"
                       Visibility="{Binding ElementName=mnuItemFive, Path=IsChecked,
                                            Converter={StaticResource boolToVis}}"/>
        </WrapPanel>
    </StackPanel>
</Window>

当然,在现实世界的应用程序中,您可能希望使用 Styles 和 DataBinding 之类的东西,但这表明您不必太复杂就能获得想要的结果。越简单通常越好。

【讨论】:

  • 感谢您提供的优质样品。不幸的是,我找不到如何在我的问题链接中指出的特定解决方案中使用它。看起来我需要一种不同的技术,因为我是动态生成内容的。
  • 在此示例中,您还将同时动态创建适当的 MenuItem。
猜你喜欢
  • 2014-05-05
  • 2021-10-03
  • 1970-01-01
  • 2019-10-13
  • 2017-11-30
  • 1970-01-01
  • 2014-07-09
  • 1970-01-01
  • 2017-09-13
相关资源
最近更新 更多