如何使网格列始终具有相同的宽度?

时间:2011-09-26 17:24:42

标签: wpf xaml grid

如果我将列的宽度设置为*,则它们的宽度最初相同,但如果某个项目大于允许的数量,则会拉伸列宽。

如何通过明确定义大小来强制我的网格保持其列的大小相同?

我不能使用UniformGrid,因为这个Grid在ItemsControl中使用,而Items需要放在特定的Grid.Row / Grid.Column

编辑以下是我当前代码的示例。

<DockPanel>

    <!-- Not showing code here for simplicity -->
    <local:ColumnHeaderControl DockPanel.Dock="Top" />
    <local:RowHeaderControl DockPanel.Dock="Left" />

    <ItemsControl ItemsSource="{Binding Events}">
        <ItemsControl.ItemContainerStyle>
            <Style>
                <Setter Property="Grid.Column" 
                        Value="{Binding DueDate.DayOfWeek, 
                            Converter={StaticResource EnumToIntConverter}}" />
            </Style>
        </ItemsControl.ItemContainerStyle>

        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition Width="*" />
                    </Grid.ColumnDefinitions>
                </Grid>
            </ItemsPanelTemplate>
        </ItemsPanel>
    </ItemsControl>

</DockPanel>

编辑#2 这是我的最终解决方案。它使列的大小正确,并在应用程序调整大小时保持大小正确。

<ColumnDefinition Width="{Binding 
    ElementName=RootControl, 
    Path=ActualWidth, 
    Converter={StaticResource MathConverter}, 
    ConverterParameter=(@VALUE-150)/7}" />

150是行标题的宽度+所有边距和边框。我实际上正在将MathConverter更新为IMultiValueConverter,因此我可以绑定这两个参数(如果您对转换器代码感兴趣,可以找到它here,尽管它是只有单值转换器)

4 个答案:

答案 0 :(得分:10)

你可以:

1)在DIP中硬编码大小:

<ColumnDefinition Width="100" />
<ColumnDefinition Width="100" />
...

2)使用SharedSizeGroup,它需要一个char

<ColumnDefinition SharedSizeGroup="A" />
<ColumnDefinition SharedSizeGroup="A" />
...

您可以阅读更多相关信息here

答案 1 :(得分:5)

您可以尝试将列的宽度绑定到一个属性,该属性将窗口的总宽度除以列数

答案 2 :(得分:0)

我没有尝试过,但我认为这应该有效:

XAML:

<ColumnDefinition Width="*" Loaded="ColumnDefinition_Loaded"/>

C#:

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

答案 3 :(得分:0)

尝试使用网格的IsSharedSizeScope:

<StackPanel Margin="15" Grid.IsSharedSizeScope="True">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" SharedSizeGroup="A"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="Auto" SharedSizeGroup="B"/>
        </Grid.ColumnDefinitions>

        <TextBlock Grid.Column="0" Text="Col 1"/>
        <TextBox Grid.Column="1" />
        <TextBlock Grid.Column="2" Text="3rd column here"/>
    </Grid>

    <Separator Margin="0,20"/>

    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" SharedSizeGroup="A"/>
            <ColumnDefinition />
            <ColumnDefinition SharedSizeGroup="B"/>
        </Grid.ColumnDefinitions>

        <TextBlock Grid.Column="0" Text="1"/>
        <TextBox Grid.Column="1"/>
    </Grid>
</StackPanel>

希望对您有帮助。

有关详细说明,请检查此链接: https://wpf.2000things.com/tag/sharedsizegroup/