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>