我正在編寫一個控件以在窗體中顯示和編輯對象。控件(FormDataView
)是ItemsControl
,其中每個項目是由Grid
組成的FormField
控件,其中字段名稱位於左列,編輯器(例如TextBox)位於右列。爲了對齊編輯器,我希望每個Grid
中的第一列共享相同的寬度。在ItemsControl的項目中的網格之間共享列寬度
所以我嘗試使用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
是如何在FormDataView
的ItemsPanel
設置,而SharedSizeGroup
中的FormField
模板中設置。這正確地表達了我想要做的事情:每個FormField
應爲第一列使用相同的寬度。然而,根據documentation爲SharedSizeGroup
財產,不支持此方案:如果您在資源模板中設置IsSharedSizeScope爲true 大小共享
電網不工作,你定義SharedSizeGroup作爲外 該模板。
好的,所以我可以理解爲什麼它不起作用......但我不知道如何解決這個限制。
有什麼想法?
注:我不想一個固定的寬度分配過程的第一列...
你爲什麼不只是使用一個GridView(有列列表視圖)? –
@Wallstreet程序員,我可以嘗試一下,如果我找到隱藏列標題的方法......但我更喜歡基於Grid的乾淨解決方案。使用GridView似乎是爲我的需要矯枉過正 –