当设置标题的MaxWidth时,为所有DataGridColumns应用相同的高度

mob*_*tte 9 c# wpf xaml

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

<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>
Run Code Online (Sandbox Code Playgroud)

"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>
Run Code Online (Sandbox Code Playgroud)

总有一个InputParameterColumn,至少有一个SingleParameterColumn.它InputParameterColumn具有固定的标题名称,而标题SingleParameterColumn可以任意长.

因为我不希望有很宽列我已经定义了MaxWidthTextBlock在头模板60,这将导致头要高,如果一列的名称很长.

这会导致列具有不同的高度,具体取决于标题名称的长度. 这是问题:

有什么方法可以找出我的ItemsControl中最高的标题有多高,然后为所有其他标题设置相同的高度,以便我的列都具有相同的大小?

alm*_*ulo 9

我终于可以重现你的问题,并设法用这些变化来解决它:

  1. Grid.IsSharedSizeScope="True"在StackPanel上设置,作为ItemsControl的ItemsPanel
  2. 在ItemTemplate上,更改HeaderTemplates for Grids的StackPanels
  3. 在每个网格上,定义具有相同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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)