フォーム内のオブジェクトを表示および編集するためのコントロールを作成しています。コントロール ( FormDataView
) は、ItemsControl
各項目が で構成されるFormField
コントロールGrid
で、左側の列にフィールド名、右側の列にエディター (TextBox など) が表示されます。エディターを揃えるために、それぞれの最初の列がGrid
同じ幅になるようにします。
だから私はIsSharedSizeScope
andを使用しようとしまし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 をそのテンプレートの外部として定義すると、グリッド サイズ共有は機能しません。
わかりました。なぜうまくいかないのか理解できます...しかし、この制限を回避する方法がわかりません。
何か案が?
NB:もちろん、最初の列に固定幅を割り当てたくありません...