我创建了一个名为“字段”的自定义控件,该控件继承自ContentControl
并包含Grid
和label
以显示字段标签,以及{{1}允许根据我们想要编辑的数据来设置控件。
然后我创建了一个名为“TextField”的自定义控件,它继承自ContentPresenter
,应该将Field
放入内容。
以下是Generic.xaml中的样式:
TextBox
根据证据,这只显示使用<Style TargetType="{x:Type controls:Field}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type controls:Field}">
<Border Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
<Grid x:Name="grd" Margin="3px">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="{Binding Path=LabelLength, RelativeSource={RelativeSource AncestorType=Control}}" />
<ColumnDefinition Width="{Binding Path=ContentLength, RelativeSource={RelativeSource AncestorType=Control}}" />
</Grid.ColumnDefinitions>
<Label Grid.Column="0" Content="{Binding Path=Label, RelativeSource={RelativeSource AncestorType=Control}}" />
<ContentPresenter Grid.Column="1" Content="{TemplateBinding Content}" Margin="{TemplateBinding Padding}" />
</Grid>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style TargetType="{x:Type controls:FieldText}" BasedOn="{StaticResource {x:Type controls:Field}}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type controls:FieldText}">
<TextBox Grid.Column="1" MaxLines="1" TextWrapping="NoWrap" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
时的文本框。但是我怎样才能通过保持控件的其余部分继承父样式来设置内容的样式(例如本例中的TextBox)?
我知道我可以为每个派生控件重写整个控件,但那是违反继承原则的,不是吗?这意味着重复的代码(这里是重复的标记),如果我在父“Field”中更改了任何内容,我将不得不在每个子控件中更改它,并存在错误的风险......
答案 0 :(得分:0)
将父控件的Content
属性设置为您可以根据需要设置样式的TextBox
实例:
<controls:Field Background="Gray">
<TextBox Grid.Column="1" MaxLines="1" TextWrapping="NoWrap" />
</controls:Field>
这是ContentControl
的使用方式。
您无法仅覆盖ControlTemplate
的一部分:
WPF: Is there a way to override part of a ControlTemplate without redefining the whole style?