如果我将列的宽度设置为*
,则它们的宽度最初相同,但如果某个项目大于允许的数量,则会拉伸列宽。
如何通过明确定义大小来强制我的网格保持其列的大小相同?
我不能使用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,尽管它是只有单值转换器)
答案 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/