我创建了一个名为“Field”的自定义控件,它继承自
然后我创建了一个名为“TextField”的自定义控件,它继承自
以下是Generic.xaml中的样式:
通过证据可以看出,当使用
我知道我可以为每个派生控件重写整个控件,但这违反了继承原则,对吧?这意味着重复的代码(此处为重复的标记),如果我更改“Field”父级中的任何内容,我将不得不更改每个子控件中的内容,存在出错的风险...
ContentControl
,包含一个Grid
和一个label
来显示字段标签,以及一个ContentPresenter
来放置根据要编辑的数据而定的控件。然后我创建了一个名为“TextField”的自定义控件,它继承自
Field
,应该将一个TextBox
放入内容中。以下是Generic.xaml中的样式:
<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>
通过证据可以看出,当使用
TextField
时只显示文本框。但是我该如何仅通过保留父控件的样式来为内容(例如此示例中的文本框)添加样式呢?我知道我可以为每个派生控件重写整个控件,但这违反了继承原则,对吧?这意味着重复的代码(此处为重复的标记),如果我更改“Field”父级中的任何内容,我将不得不更改每个子控件中的内容,存在出错的风险...