Wpf 如何使网格列始终保持相同的宽度?

Wpf 如何使网格列始终保持相同的宽度?,wpf,xaml,grid,Wpf,Xaml,Grid,如果我将列的宽度设置为*,它们最初的宽度相同,但如果某个项目大于允许的数量,则会拉伸列宽 如何强制网格保持其列的大小与显式定义的大小相同 我无法使用UniformGrid,因为此网格正在ItemsControl中使用,并且需要将项目放置在特定的网格。行/网格。列点中 编辑以下是我当前代码的示例 <DockPanel> <!-- Not showing code here for simplicity --> <local:ColumnHeaderC

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

如何强制网格保持其列的大小与显式定义的大小相同

我无法使用UniformGrid,因为此网格正在ItemsControl中使用,并且需要将项目放置在特定的
网格。行
/
网格。列
点中

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

<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
,这样我可以绑定这两个参数(如果您对转换器代码感兴趣,可以找到它,尽管它只是单值转换器)

您可以:

1) 在DIP中硬编码a尺寸:

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

...
2) 使用SharedSizeGroup,它需要一个字符

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

...

您可以阅读更多有关它的信息

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

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

XAML:


最干净的方法是像这样使用
UniformGrid

<UniformGrid Rows="1">
    <Rectangle Fill="Blue" />
    <Rectangle Fill="Yellow" />
    <Rectangle Fill="Red" />
</UniformGrid>


当用作
ItemsPanel

时,请尝试使用iSharedSizeScope工作网格:

<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>

我希望有帮助

有关详细说明,请选中此链接:

我不想硬编码宽度,因为网格将占用所有可用空间,而SharedSizeGroup使所有项目与最大项目的宽度相同。您可以发布一些代码吗?这种行为很奇怪。星形列只应在容器调整大小时调整大小,内容不起作用。对于选项2,您必须为周围的网格设置
,我现在正在尝试,但我遇到的问题是网格没有占用全部空间,因此我还必须计算边距、其他控件宽度,等我可以计算出除以7的大小。我的基本面板是一个DockPanel,根据需要动态绘制标题,然后ItemsControl的内容会占用所有剩余空间。问题是,如果一个项目的宽度超过
*
允许的范围,它会将列拉伸到该大小以外。您发布的代码只会使所有列等于最大列宽,我不希望这样。您是否确实尝试使用相同的处理程序设置所有列定义-ColumnDefinition\u Loaded??代码应将所有最大宽度设置为任意值(允许*)。在那之后,任何放在里面的项目都不应该改变大小。是的,我做了,它使所有列都和最大的项目一样宽,这使得部分网格无法显示,因为我没有水平滚动条。此外,标题不再对齐,如果用户调整应用程序的大小,它也不会自动调整大小。我尝试手动添加项目,这就是为什么我想它不会以这种方式显示给我。抱歉,我想唯一的解决方案是按照msmucker0527的建议手动计算。正如我在问题中所说的,我不能使用UniformGrid,因为项目需要放置在特定的
网格。行
/
网格。列
点中,并且不填充网格中的每个正方形。
<UniformGrid Rows="1">
    <Rectangle Fill="Blue" />
    <Rectangle Fill="Yellow" />
    <Rectangle Fill="Red" />
</UniformGrid>
<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>