当设置标题的最大宽度时,如何为所有DataGridColumns应用相同的高度

9

我有一个包含动态可变数量的DataGrids的ItemsControl:

<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和至少一个SingleParameterColumnInputParameterColumn具有固定的标题名称,而SingleParameterColumn的标题可以任意长。

由于我不想拥有非常宽的列,因此我已将标题模板中TextBlockMaxWidth定义为60,这会导致如果列名很长,则标题会变高。

这会导致列的高度根据标题名称的长度而异。 Here is the issue:

是否有办法找出我的ItemsControl中最高的标题有多高,并设置所有其他标题的相同高度,以便我的所有列都具有相同的大小?


你能展示一下正在经历的屏幕截图吗? - ΩmegaMan
这是屏幕截图:http://s14.postimg.org/kxhfvh9gh/Capture.png 我想让所有标题的高度相同,以便行可以对齐。 - mobearette
这很奇怪,我刚刚尝试了你的代码,我的表头单元格自动都是相同大小的... 你编辑了DataGrid模板吗?或者在HeaderTemplate上有什么你没有展示给我们的东西吗? - almulo
不,那就是头部模板中的全部内容。你能否把你的代码贴出来,这样我就可以与我的进行比较? - mobearette
我刚刚将您示例中的DataGrid复制到一个新解决方案中,将DataGridTemplateColumn复制了两次,并直接为每个TextBlock设置了文本,而不是使用绑定。此外,我使用Items添加了一些字符串,而不是绑定ItemsSource。 - almulo
2个回答

9

我终于成功重现了你的问题,并通过以下更改解决了它:

  1. 在作为ItemsPanel的StackPanel上设置Grid.IsSharedSizeScope="True"
  2. 在ItemTemplate中,将HeaderTemplates中的StackPanels更改为Grids
  3. 在每个Grid上,定义一个具有相同SharedSizeGroup标识符的单行

ItemsControl:

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

ItemTemplate:

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

不行,因为我的列不是在一个数据网格中绑定的,而是每一列都是一个数据网格,包含一个模板列。 - mobearette
好的,我明白了,这就是为什么我无法再现这个问题。让我再试一遍然后再回复你。 - almulo
完成。使用上述代码成功地复现并解决了问题...不要在DataGrid上设置IsSharedSizeScope,而是要在ItemsControl的ItemsPanel内部的StackPanel上设置它。 - almulo
1
谢谢,非常有效。感谢您抽出时间来解决这个问题。祝您有美好的一天! - mobearette

0
你可以编写一个行为,附加到标题的TextBlock上,并执行以下操作:
  • 订阅SizeChanged事件
  • 在某个地方(静态属性或帮助类...)存储最大尺寸
  • 如果此最大尺寸发生更改,请仅更改附加了该行为的所有元素的高度

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接