C# 设置标头的MaxWidth时,对所有DataGridColumns应用相同的高度
我有一个ItemsControl,其中包含可动态更改数量的数据网格:C# 设置标头的MaxWidth时,对所有DataGridColumns应用相同的高度,c#,wpf,xaml,C#,Wpf,Xaml,我有一个ItemsControl,其中包含可动态更改数量的数据网格: <ItemsControl ItemsSource="{Binding Table.Columns}"> <ItemsControl.ItemsPanel> <ItemsPanelTemplate> <StackPanel Orientation="Horizontal" VerticalAlignment="Stretch"/>
<ItemsControl ItemsSource="{Binding Table.Columns}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" VerticalAlignment="Stretch"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplateSelector>
<local:ColumnTemplateSelector InputParameterColumnTemplate="{StaticResource InputParamterColumn}"
SingleParameterColumnTemplate="{StaticResource SingleParameterColumn}"/>
</ItemsControl.ItemTemplateSelector>
</ItemsControl>
“SingleParameterColumn”的模板定义如下:
<DataTemplate x:Key="SingleParameterColumn">
<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Cells}"
RowHeight="25" RowHeaderWidth="0" >
<DataGrid.Columns>
<DataGridTemplateColumn>
<DataGridTemplateColumn.HeaderTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Name}"
TextWrapping="Wrap"
TextAlignment="Center"
MaxWidth="60">
</TextBlock>
<Button>
<Image ... />
</Button>
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.HeaderTemplate>
<DataGridTemplateColumn.CellTemplateSelector>....
</DataGridTemplateColumn.CellTemplateSelector>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</DataTemplate>
....
始终有一个InputParameterColumn
和至少一个SingleParameterColumn
。InputParameterColumn
具有固定的标题名称,而SingleParameterColumn
的标题可以任意长
由于我不希望有非常宽的列,我已将标题模板中TextBlock
的MaxWidth
定义为60,如果列的名称非常长,则标题会更高
这会导致列具有不同的高度,具体取决于标题名称的长度。
是否有任何方法可以确定ItemsControl中最高的标题有多高,然后为所有其他标题设置相同的高度,以便所有列都具有相同的大小 您可以编写附加到标题
TextBlock
的行为,并执行以下操作:
- 订阅
事件SizeChanged
- 存储在最大尺寸的地方(静态道具或助手类…)
- 如果此最大尺寸发生更改,只需更改行为所附着的所有元素的高度即可
Grid.IsSharedSizeScope=“True”
,该StackPanel用作ItemsControl的ItemsPanelSharedSizeGroup
标识符定义一行<ItemsControl ItemsSource="{Binding Table.Columns}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" VerticalAlignment="Stretch"
Grid.IsSharedSizeScope="True" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplateSelector>
<local:ColumnTemplateSelector InputParameterColumnTemplate="{StaticResource InputParamterColumn}"
SingleParameterColumnTemplate="{StaticResource SingleParameterColumn}"/>
</ItemsControl.ItemTemplateSelector>
</ItemsControl>
项目模板:
<DataTemplate x:Key="SingleParameterColumn">
<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Cells}"
RowHeight="25" RowHeaderWidth="0">
<DataGrid.Columns>
<DataGridTemplateColumn>
<DataGridTemplateColumn.HeaderTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="*"
SharedSizeGroup="DataGridHeaderRow" />
</Grid.RowDefinitions>
<TextBlock Text="{Binding Name}"
TextWrapping="Wrap"
TextAlignment="Center"
MaxWidth="60">
</TextBlock>
<Button Grid.Column="1">
<Image ... />
</Button>
</Grid>
</DataTemplate>
</DataGridTemplateColumn.HeaderTemplate>
<DataGridTemplateColumn.CellTemplateSelector>....
</DataGridTemplateColumn.CellTemplateSelector>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</DataTemplate>
....
你能展示一个屏幕截图吗?下面是屏幕截图:我希望所有标题都具有相同的高度,以便行可以对齐。这很奇怪,我刚刚尝试了你的代码,我的标题单元格自动都是相同的大小。。。您是否编辑了DataGrid模板?或者HeaderTemplate上有什么你没有展示给我们的吗?没有,这就是header模板中的所有内容。你能发布你的代码吗?我只是把你例子中的DataGrid复制到了一个新的解决方案中,复制了DataGridTemplateColumn两次,并直接为每个文本块设置了一个文本,而不是使用绑定。还使用Items来添加两个字符串,而不是绑定ItemsSource。不,这不起作用,因为我的列没有绑定到一个数据网格中,但每个列都是一个单独的数据网格,包含一个模板列。好的,我明白了,这就是为什么我无法重现这个问题。让我再试一次,我会给你回复的。完成。设法复制它并用上面的代码解决它。。。您需要在ItemsControl的ItemsPanel内的StackPanel上设置它,而不是在DataGrid上设置IsSharedSizeScope
。谢谢,工作非常顺利。谢谢你花时间来解决这个问题。祝您有个美好的一天!