Совместное использование ширины столбцов между несколькими элементами управления WPF

Есть ли способ разделения ширины столбцов между элементами управления, а не только между несколькими сетками на одном элементе управления?

Четкая диаграмма того, что я пытаюсь получить:

alt text

Я в настоящее время возни с получением ширины этикетки в первом столбце каждого UserControl, но это, кажется, грязное решение, которое является довольно тяжелым CPU (найти метки и вычисление ширины текста до его визуализации является противный!).

Я уже много читал о SharedSizeGroups, но ничего не предлагаю, чтобы они работали с разными элементами управления. Есть ли простое решение или даже менее простой, который не является отвратительным?!

Ответы

Ответ 1

Оба предыдущих ответа верны. Вот пример (взятый в основном из MSDN) о том, как вы можете использовать это на двух разных UserControls, установив Grid.IsSharedSizeScope = "True" на родительский контейнер. Обратите внимание на атрибут SharedSizeGroup в ColumnDefinition. Вы можете увидеть эффект, переключая Grid.IsSharedSizeScope True/False

MainWindow

<StackPanel Grid.IsSharedSizeScope="True">
    <my:UserControl1 HorizontalAlignment="Left" x:Name="userControl11" />
    <my:UserControl2 HorizontalAlignment="Left" x:Name="userControl21" />
</StackPanel>

UserControl1

<UserControl ...>
    <Grid ShowGridLines="True" Margin="0,0,10,0">
        <Grid.ColumnDefinitions>
            <ColumnDefinition SharedSizeGroup="FirstColumn"/>
            <ColumnDefinition SharedSizeGroup="SecondColumn"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" SharedSizeGroup="FirstRow"/>
        </Grid.RowDefinitions>

        <Rectangle Fill="Silver" Grid.Column="0" Grid.Row="0" Width="200" Height="100"/>
        <Rectangle Fill="Blue" Grid.Column="1" Grid.Row="0" Width="150" Height="100"/>

        <TextBlock Grid.Column="0" Grid.Row="0" FontWeight="Bold">First Column</TextBlock>
        <TextBlock Grid.Column="1" Grid.Row="0" FontWeight="Bold">Second Column</TextBlock>
    </Grid>

</UserControl>

UserControl2

<UserControl ...>
    <Grid ShowGridLines="True" Margin="0,0,10,0">
        <Grid.ColumnDefinitions>
            <ColumnDefinition SharedSizeGroup="FirstColumn"/>
            <ColumnDefinition SharedSizeGroup="SecondColumn"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" SharedSizeGroup="FirstRow"/>
        </Grid.RowDefinitions>

        <Rectangle Fill="Silver" Grid.Column="0" Grid.Row="0" />
        <Rectangle Fill="Blue" Grid.Column="1" Grid.Row="0" />

        <TextBlock Grid.Column="0" Grid.Row="0" FontWeight="Bold">First Column</TextBlock>
        <TextBlock Grid.Column="1" Grid.Row="0" FontWeight="Bold">Second Column</TextBlock>
    </Grid>
</UserControl>

Ответ 2

Вы должны установить для свойства IsSharedSizeScope значение true в элементе управления, содержащем оба UserControls

Ответ 3

Вы пытались настроить Grid.IsSharedSizeScope = "True" на каждом пользовательском элементе управления?