How to remove collapsed space in a listbox with items type wrappanel, full source + pic included

无人久伴 提交于 2019-12-24 12:34:11

问题


I have a ListBox with ItemsPanelTemplate of WrapPanel. There's some left & right padding of the collapsed elements, which I want to get rid of... When the elements are visible, the image is a nice square with five buttons per row. Here is an image: http://iterationx.posterous.com/71739342

How can I get rid of the padding at the beginning of the first button when my A-E buttons are collapsed?

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" SizeToContent="WidthAndHeight"
        >
        <Grid Margin="100,100,100,100">
        <StackPanel>
            <ListBox Name="MainButtonListBox" HorizontalContentAlignment="Stretch" BorderThickness="0" ScrollViewer.HorizontalScrollBarVisibility="Disabled" Padding="0" Width="550">
                <ListBox.ItemsPanel>
                    <ItemsPanelTemplate >
                        <WrapPanel />
                    </ItemsPanelTemplate>
                </ListBox.ItemsPanel>
                <ListBox.ItemTemplate >
                    <DataTemplate>
                        <Button  Content="{Binding Path=ButtonName}"  Click="Button_Click" DataContext="{Binding}" Width="100"  Height="75"   Visibility="{Binding Path=Visibility}" />
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
        </StackPanel>
    </Grid>
</Window>


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApplication2
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public class ButtonObj
        {
            public string ButtonName { get; set; }
            public Visibility Visibility { get; set; }
        }

        List<ButtonObj> AEList = new List<ButtonObj>();
        List<ButtonObj> MainButtonList = new List<ButtonObj>();
        public MainWindow()
        {
            InitializeComponent();

            AEList.Add(new ButtonObj() { ButtonName = "A", Visibility = Visibility.Collapsed });
            AEList.Add(new ButtonObj() { ButtonName = "B", Visibility = Visibility.Collapsed });
            AEList.Add(new ButtonObj() { ButtonName = "C", Visibility = Visibility.Collapsed });
            AEList.Add(new ButtonObj() { ButtonName = "D", Visibility = Visibility.Collapsed });
            AEList.Add(new ButtonObj() { ButtonName = "E", Visibility = Visibility.Collapsed });

            foreach (ButtonObj b1 in AEList) MainButtonList.Add(b1);

            MainButtonList.Add(new ButtonObj() { ButtonName = "Expand A-E", Visibility = Visibility.Visible });
            MainButtonList.Add(new ButtonObj() { ButtonName = "G", Visibility = Visibility.Visible });
            MainButtonList.Add(new ButtonObj() { ButtonName = "H", Visibility = Visibility.Visible });
            MainButtonList.Add(new ButtonObj() { ButtonName = "I", Visibility = Visibility.Visible });
            MainButtonList.Add(new ButtonObj() { ButtonName = "Collapse A-E", Visibility = Visibility.Visible });

            MainButtonList.Add(new ButtonObj() { ButtonName = "K", Visibility = Visibility.Visible });
            MainButtonList.Add(new ButtonObj() { ButtonName = "L", Visibility = Visibility.Visible });
            MainButtonList.Add(new ButtonObj() { ButtonName = "M", Visibility = Visibility.Visible });
            MainButtonList.Add(new ButtonObj() { ButtonName = "N", Visibility = Visibility.Visible });
            MainButtonList.Add(new ButtonObj() { ButtonName = "O", Visibility = Visibility.Visible });

            MainButtonListBox.ItemsSource = MainButtonList;
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Button btn = sender as Button;
            ButtonObj obj = btn.DataContext as ButtonObj;

            if (obj.ButtonName == "Expand A-E")
            {
                foreach (ButtonObj b1 in AEList) b1.Visibility = System.Windows.Visibility.Visible; 
            }
            if (obj.ButtonName == "Collapse A-E")
            {
                foreach (ButtonObj b1 in AEList) b1.Visibility = System.Windows.Visibility.Collapsed; 
            }

            MainButtonListBox.ItemsSource = null;
            MainButtonListBox.ItemsSource = MainButtonList;
        }
    }
}

回答1:


you just collapse the content of the listbox item. You have to style the ListBoxItem (which is not removed).

<ListBox Name="MainButtonListBox" HorizontalContentAlignment="Stretch" BorderThickness="0" ScrollViewer.HorizontalScrollBarVisibility="Disabled" Padding="0" Width="550" >
     <ListBox.ItemContainerStyle>
          <Style TargetType="{x:Type ListBoxItem}">
              <Setter Property="Padding" Value="0,0,0,0"/>
          </Style>
     </ListBox.ItemContainerStyle>
     <ListBox.ItemsPanel>
          <ItemsPanelTemplate >
               <WrapPanel />
           </ItemsPanelTemplate>
     ...

generally it would be better to use the filter possibilities, so that the items are realy removed from the listbox and not just the content hidden (the items are still selectable with the keyboard)

you also can (better than first style) collapse the whole item:

<ListBox.ItemContainerStyle>
    <Style TargetType="{x:Type ListBoxItem}">                        
        <Setter Property="Visibility" Value="{Binding Path=Visibility}"/>
    </Style>
</ListBox.ItemContainerStyle>


来源:https://stackoverflow.com/questions/7521157/how-to-remove-collapsed-space-in-a-listbox-with-items-type-wrappanel-full-sourc

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!