.netwpfxaml.net-4.5wpf-4.5

WPF Grid.IsSharedSizeScope between two parent controls?


I have a situation where I need to share the width of a column between grids in two group boxes, the XAML looks something like this:

<GroupBox Header="Box A">
        <StackPanel Orientation="Horizontal">
            <!-- Labels -->
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition SharedSizeGroup="Labels"></ColumnDefinition>
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition SharedSizeGroup="Rows"></RowDefinition>
                </Grid.RowDefinitions>

                <Label Grid.Column="0" Grid.Row="0">Label A</Label>
            </Grid>

            <!-- Fields -->
            <ItemsControl Grid.IsSharedSizeScope="True" ItemsSource="{Binding Items}">
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <StackPanel Orientation="Horizontal"></StackPanel>
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <Grid>
                            <Grid.RowDefinitions>
                                <RowDefinition SharedSizeGroup="Rows"></RowDefinition>
                            </Grid.RowDefinitions>

                            <TextBox Text="{Binding PropertyA}"></TextBox>
                        </Grid>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </StackPanel>
    </GroupBox>

    <GroupBox Header="Box B">
        <StackPanel Orientation="Horizontal">
            <!-- Labels -->
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition SharedSizeGroup="Labels"></ColumnDefinition>
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition SharedSizeGroup="Rows"></RowDefinition>
                </Grid.RowDefinitions>

                <Label Grid.Column="0" Grid.Row="0">Label B</Label>
            </Grid>

            <!-- Fields -->
            <ItemsControl Grid.IsSharedSizeScope="True" ItemsSource="{Binding Items}">
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <StackPanel Orientation="Horizontal"></StackPanel>
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <Grid>
                            <Grid.RowDefinitions>
                                <RowDefinition SharedSizeGroup="Rows"></RowDefinition>
                            </Grid.RowDefinitions>

                            <TextBox Text="{Binding PropertyB}"></TextBox>
                        </Grid>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </StackPanel>
    </GroupBox>

I have tried setting Grid.IsSharedSizeScope to true on both the StackPanel and GroupBox containing the child grids, but this did not work. I was wondering what approach I should take in this situation to share the size between the Grid column definitions with the SharedSizeGroup of 'Labels'?

Thanks,

Alex.


Solution

  • Surround your two GroupBoxes with a Grid and set the Grid.IsSharedSizeScope.

    <Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
          xmlns:sys="clr-namespace:System;assembly=mscorlib"
          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
      <Grid Grid.IsSharedSizeScope="True">
        <Grid.Resources>
          <x:Array x:Key="xItems" Type="sys:String">
            <sys:String>Hello</sys:String>
            <sys:String>World ddd</sys:String>
          </x:Array>
          <x:Array x:Key="xItems2" Type="sys:String">
            <sys:String>Hello long fsdfhuzweb kbhui</sys:String>
            <sys:String>World</sys:String>
          </x:Array>
        </Grid.Resources>
    
        <Grid.ColumnDefinitions>
          <ColumnDefinition Width="*"/>
          <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
    
        <GroupBox Grid.Column="0" Header="Box A">
          <StackPanel Orientation="Horizontal">
            <!-- Labels -->
            <Grid>
              <Grid.ColumnDefinitions>
                <ColumnDefinition SharedSizeGroup="Labels" />
              </Grid.ColumnDefinitions>
              <Label Grid.Column="0" Grid.Row="0">Label A</Label>
            </Grid>
            <!-- Fields -->
            <ItemsControl ItemsSource="{Binding Source={StaticResource xItems}}">
              <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                  <StackPanel Orientation="Horizontal" />
                </ItemsPanelTemplate>
              </ItemsControl.ItemsPanel>
              <ItemsControl.ItemTemplate>
                <DataTemplate>
                  <Grid>
                    <Grid.ColumnDefinitions>
                      <ColumnDefinition SharedSizeGroup="Fields" />
                    </Grid.ColumnDefinitions>
                    <Grid.RowDefinitions>
                      <RowDefinition SharedSizeGroup="Rows" />
                    </Grid.RowDefinitions>
                    <TextBox Text="{Binding Mode=OneWay}" />
                  </Grid>
                </DataTemplate>
              </ItemsControl.ItemTemplate>
            </ItemsControl>
          </StackPanel>
        </GroupBox>
    
        <GroupBox Grid.Column="1" Header="Box B">
          <StackPanel Orientation="Horizontal">
            <!-- Labels -->
            <Grid>
              <Grid.ColumnDefinitions>
                <ColumnDefinition SharedSizeGroup="Labels" />
              </Grid.ColumnDefinitions>
              <Grid.RowDefinitions>
                <RowDefinition SharedSizeGroup="Rows" />
              </Grid.RowDefinitions>
              <Label Grid.Column="0" Grid.Row="0">Label B long</Label>
            </Grid>
            <!-- Fields -->
            <ItemsControl ItemsSource="{Binding Source={StaticResource xItems2}}">
              <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                  <StackPanel Orientation="Horizontal" />
                </ItemsPanelTemplate>
              </ItemsControl.ItemsPanel>
              <ItemsControl.ItemTemplate>
                <DataTemplate>
                  <Grid>
                    <Grid.ColumnDefinitions>
                      <ColumnDefinition SharedSizeGroup="Fields" />
                    </Grid.ColumnDefinitions>
                    <Grid.RowDefinitions>
                      <RowDefinition SharedSizeGroup="Rows" />
                    </Grid.RowDefinitions>
                    <TextBox Text="{Binding Mode=OneWay}" />
                  </Grid>
                </DataTemplate>
              </ItemsControl.ItemTemplate>
            </ItemsControl>
          </StackPanel>
        </GroupBox>
      </Grid>
    </Page>
    

    enter image description here

    Hope this helps.