我正在编写一个控件来显示和编辑表单中的对象。控件(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
应该对第一列使用相同的宽度。但是,根据{{1}}属性的documentation,不支持此方案:
如果将IsSharedSizeScope设置为true,则网格大小共享不起作用 在资源模板中,您将SharedSizeGroup定义为外部 那个模板。
好的,所以我可以理解为什么它不起作用......但我不知道如何解决这个限制。
有什么想法吗?
N.B。:我当然不希望为第一列指定固定宽度......
答案 0 :(得分:3)
可悲的是,我无法访问我的Visual Studio环境,因此无法检查以下提示......
Grid.IsSharedSizeScope="True"
分配给FormDataView
本身,而不是ItemsPanel
。您真的需要StackPanel
作为项目面板吗?你不能没有那个吗?查看上述更改是否有效......
SharedSizeGroup="headerColumn"
的商品数据模板中分配FormDataView
,而不是ControlTemplate
个人FormField
。如果这有帮助,请告诉我....