Я пишу элемент управления для отображения и редактирования объектов в форме.Элемент управления (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 как вне этого шаблона.
ОК, поэтому я могу понять, почему это не работает ... но я не знаю, как обойти это ограничение.
Есть идеи?
Примечание: я не хочу назначать фиксированную ширину для первого столбца курса ...