如何使包含ItemsControl的WPF网格具有相等大小的列

富氮

这里这里也有类似的问题,但是我都尝试了所有方法,但它们并不能解决我的问题。

我想在WPF(布局)网格中的屏幕上显示复选框的网格。这些复选框具有可变长度的文本。我希望所有列都具有相同的宽度,并且它们全部都显示不被截断的文本。也就是说,我都需要它们全部具有最长的文本宽度。我希望屏幕本身能够适应内容的大小。也就是说,其宽度足以显示所有复选框。

复选框的列表是可变的,取决于其他因素,因此我正在使用ItemsControl来显示它们。下面是该代码的简化版本。

如果运行此列,则第二个列为“长文本”的列比文本较短的列宽得多。为了使它们都具有相同的宽度,我尝试使用SharedSizeGroup,还尝试在列加载事件中设置MaxWidth = ActualWidth,这是在其他地方建议的解决方案,但这些方法不起作用。

我敢肯定对此必须有一个简单的答案,这似乎是要做布局控件的相当基本的事情。请问我做错了什么?

XAML:

<Window x:Class="GridColsEqualSize.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" SizeToContent="WidthAndHeight" FontSize="25">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="Auto" /> <!-- In the real project second row is for OK/Cancel buttons -->
        </Grid.RowDefinitions>
        <ItemsControl ItemsSource="{Binding CheckBoxItems}"  Grid.Row="0" Grid.Column="0">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <!--Whatever I do I can't get the screen to resize and the cols to have the same width-->
                            <ColumnDefinition Width="Auto" SharedSizeGroup="A" />
                            <ColumnDefinition Width="Auto" SharedSizeGroup="A" />
                            <ColumnDefinition Width="Auto" SharedSizeGroup="A" />
                        </Grid.ColumnDefinitions>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="Auto" />
                        </Grid.RowDefinitions>
                    </Grid>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <CheckBox Content="{Binding Text}" IsChecked="{Binding Enabled}"                            
                                  Margin="0,0,10,0"></CheckBox>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
            <ItemsControl.ItemContainerStyle>
                <Style>
                    <Style.Setters>
                        <Setter Property="Grid.Row" Value="{Binding GridRow}" />
                        <Setter Property="Grid.Column" Value="{Binding GridColumn}" />
                    </Style.Setters>
                </Style>
            </ItemsControl.ItemContainerStyle>
        </ItemsControl>
    </Grid>
</Window>

C#:

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            DataContext = this;
            CheckBoxItems = new List<CheckBoxItem>
            {
                new CheckBoxItem("A", true),
                new CheckBoxItem("B"),
                new CheckBoxItem("C", true),
                new CheckBoxItem("D"),
                new CheckBoxItem("E", true),
                new CheckBoxItem("F"),
                new CheckBoxItem("G"),
                new CheckBoxItem("Long text", true),
                new CheckBoxItem("")

            };
            SetCheckBoxItemRowsAndColumns();
        }

        public List<CheckBoxItem> CheckBoxItems { get; set; }

        private void SetCheckBoxItemRowsAndColumns()
        {
            int currentColumn = 0;
            int currentRow = 0;
            foreach (CheckBoxItem checkBoxItem in CheckBoxItems)
            {
                checkBoxItem.GridColumn = currentColumn;
                checkBoxItem.GridRow = currentRow;
                if (currentColumn != 2)
                {
                    currentColumn++;
                }
                else
                {
                    currentRow++;
                    currentColumn = 0;
                }
            }
        }

        public class CheckBoxItem
        {
            public CheckBoxItem(string text, bool enabled = false)
            {
                Text = text;
                Enabled = enabled;
            }

            public string Text { get; set; }
            public bool Enabled { get; set; }
            public int GridRow { get; set; }
            public int GridColumn { get; set; }
        }

        private void FrameworkContentElement_OnLoaded(object sender, RoutedEventArgs e)
        {
            ((ColumnDefinition)sender).MaxWidth = ((ColumnDefinition)sender).ActualWidth;
        }
    }
弥亚

一切都好:)您选择了正确的解决方案'SharedSizeGroup'

您只需将Grid.IsSharedSizeScope =“ True”添加到ItemsControl中:

    ...
    </Grid.RowDefinitions>
    <ItemsControl Grid.IsSharedSizeScope="True" ItemsSource="{Binding CheckBoxItems}"  Grid.Row="0" Grid.Column="0" >
        <ItemsControl.ItemsPanel>
    ...

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

具有多列的WPF ItemsControl

来自分类Dev

Android:如何实现具有不同列/行大小的网格

来自分类Dev

具有ItemsControl的网格中的Gridsplitter

来自分类Dev

网格右对齐时大小相等的列

来自分类Dev

WPF:计算网格列的大小

来自分类Dev

如何创建具有随机大小的div的随机布局的网格

来自分类Dev

如何修复具有固定大小的行网格视图产品?

来自分类Dev

创建具有水平延伸的三个相等列的网格

来自分类Dev

如何选择列中具有相等值的行

来自分类Dev

如何在WPF中将具有folderbrowserdialog的路径目录中的文件列出到一列数据网格中?

来自分类Dev

如何确保包含跨度的 div 具有 div 的大小

来自分类Dev

如何创建具有精确像素大小的WPF窗口?

来自分类Dev

如何在XAML中更改窗口大小时使具有相等空间(宽度和高度)的内容重新调整大小?

来自分类Dev

具有不同调整大小“优先级”的网格列

来自分类Dev

具有可调整大小的行和列的Qt QML网格

来自分类Dev

弯曲以具有相等宽度的列

来自分类Dev

WPF如何在代码中将网格的行和列大小重置为“ *”

来自分类Dev

WPF如何将代码中的网格行和列大小重置为“ *”

来自分类Dev

如何证明相等的函数类型具有相等的域?

来自分类Dev

如何证明相等的函数类型具有相等的域?

来自分类Dev

如何将自动生成的网格转移到具有单独列的网格

来自分类Dev

具有WPF的C#-创建在运行时可调整大小的按钮网格

来自分类Dev

WPF:如何使文本框具有动态大小,但又不能自动调整大小?

来自分类Dev

如何在WPF中使按钮内的网格具有100%的宽度?

来自分类Dev

如何划分具有不同大小(熊猫)的两列?

来自分类常见问题

Bootstrap 3.0-包含固定列大小的流体网格

来自分类Dev

如何检查两个相等大小的数组在C中是否具有相同的值?(复杂度O(n))

来自分类Dev

朱莉娅:对于两个大小相等的向量,如何使直方图具有相同数量的面元?

来自分类Dev

如何从包含小数的列中选择具有整数的行

Related 相关文章

  1. 1

    具有多列的WPF ItemsControl

  2. 2

    Android:如何实现具有不同列/行大小的网格

  3. 3

    具有ItemsControl的网格中的Gridsplitter

  4. 4

    网格右对齐时大小相等的列

  5. 5

    WPF:计算网格列的大小

  6. 6

    如何创建具有随机大小的div的随机布局的网格

  7. 7

    如何修复具有固定大小的行网格视图产品?

  8. 8

    创建具有水平延伸的三个相等列的网格

  9. 9

    如何选择列中具有相等值的行

  10. 10

    如何在WPF中将具有folderbrowserdialog的路径目录中的文件列出到一列数据网格中?

  11. 11

    如何确保包含跨度的 div 具有 div 的大小

  12. 12

    如何创建具有精确像素大小的WPF窗口?

  13. 13

    如何在XAML中更改窗口大小时使具有相等空间(宽度和高度)的内容重新调整大小?

  14. 14

    具有不同调整大小“优先级”的网格列

  15. 15

    具有可调整大小的行和列的Qt QML网格

  16. 16

    弯曲以具有相等宽度的列

  17. 17

    WPF如何在代码中将网格的行和列大小重置为“ *”

  18. 18

    WPF如何将代码中的网格行和列大小重置为“ *”

  19. 19

    如何证明相等的函数类型具有相等的域?

  20. 20

    如何证明相等的函数类型具有相等的域?

  21. 21

    如何将自动生成的网格转移到具有单独列的网格

  22. 22

    具有WPF的C#-创建在运行时可调整大小的按钮网格

  23. 23

    WPF:如何使文本框具有动态大小,但又不能自动调整大小?

  24. 24

    如何在WPF中使按钮内的网格具有100%的宽度?

  25. 25

    如何划分具有不同大小(熊猫)的两列?

  26. 26

    Bootstrap 3.0-包含固定列大小的流体网格

  27. 27

    如何检查两个相等大小的数组在C中是否具有相同的值?(复杂度O(n))

  28. 28

    朱莉娅:对于两个大小相等的向量,如何使直方图具有相同数量的面元?

  29. 29

    如何从包含小数的列中选择具有整数的行

热门标签

归档