Разделить ширину столбца между сетками в элементах ItemsControl - PullRequest
1 голос
/ 28 июля 2011

Я пишу элемент управления для отображения и редактирования объектов в форме.Элемент управления (FormDataView) представляет собой ItemsControl, где каждый элемент представляет собой элемент управления FormField, состоящий из Grid, с именем поля в левом столбце и редактором (например, TextBox) в правом столбце.Чтобы выровнять редакторы, я хочу, чтобы первый столбец в каждом Grid имел одинаковую ширину.

Поэтому я попытался использовать IsSharedSizeScope и SharedSizeGroup, но это не работает,Первый столбец имеет различную ширину в каждом FormField.

Вот стили для этих элементов управления:

<Style TargetType="{x:Type ctl:FormDataView}" BasedOn="{StaticResource ResourceKey={x:Type ItemsControl}}">
    <Setter Property="ItemsPanel">
        <Setter.Value>
            <ItemsPanelTemplate>
                <StackPanel Orientation="Vertical"
                            Grid.IsSharedSizeScope="True"
                            IsItemsHost="True" />
            </ItemsPanelTemplate>
        </Setter.Value>
    </Setter>
</Style>

<Style TargetType="{x:Type ctl:FormField}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ctl:FormField}">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto" SharedSizeGroup="headerColumn" />
                        <ColumnDefinition Width="*" />
                    </Grid.ColumnDefinitions>
                    <ContentPresenter Grid.Column="0"
                                      Content="{TemplateBinding Header}"
                                      Margin="3"
                                      TextElement.FontWeight="Bold" />
                    <ContentPresenter Grid.Column="1"
                                      Name="PART_Display"
                                      ContentTemplate="{TemplateBinding DisplayTemplate}"
                                      Margin="2"/>
                    <ContentPresenter Grid.Column="1"
                                      Name="PART_Editor"
                                      ContentTemplate="{TemplateBinding EditorTemplate}"
                                      Margin="2"
                                      Visibility="Collapsed" />
                </Grid>
                <ControlTemplate.Triggers>
                    <DataTrigger Binding="{Binding IsInEditMode, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ctl:FormDataView}}}"
                                 Value="True">
                        <Setter TargetName="PART_Display" Property="Visibility" Value="Collapsed" />
                        <Setter TargetName="PART_Editor" Property="Visibility" Value="Visible" />
                    </DataTrigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Обратите внимание, как Grid.IsSharedSizeScope установлен в ItemsPanel из FormDataView, в то время как SharedSizeGroup установлен в шаблоне FormField.Это правильно отражает то, что я хочу сделать: каждый FormField должен использовать одинаковую ширину для первого столбца.Однако, согласно документации для свойства SharedSizeGroup, этот сценарий не поддерживается:

Совместное использование размера сетки не работает, если для IsSharedSizeScope задано значение true в ресурсешаблон, и вы определяете SharedSizeGroup как вне этого шаблона.

ОК, поэтому я могу понять, почему это не работает ... но я не знаю, как обойти это ограничение.

Есть идеи?

Примечание: я не хочу назначать фиксированную ширину для первого столбца курса ...

1 Ответ

3 голосов
/ 30 июля 2011

К сожалению, у меня нет доступа к моей среде Visual Studio, поэтому я не смог проверить следующие советы ...

  1. Назначить Grid.IsSharedSizeScope="True" для FormDataView, а не для ItemsPanel.Вам действительно нужно StackPanel в качестве панели предметов?Вы не можете жить без этого?

Посмотрите, сработает ли вышеупомянутое изменение в первую очередь ...

  1. , если нет, обновите свой код уровня предмета и назначьте SharedSizeGroup="headerColumn" в вашем предметешаблон данных вашего FormDataView, а не в ControlTemplate отдельного FormField.

Дайте мне знать, если это поможет ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...