C# WPF子控件,仅样式内容部分

C# WPF子控件,仅样式内容部分,c#,wpf,xaml,inheritance,custom-controls,C#,Wpf,Xaml,Inheritance,Custom Controls,我创建了一个名为“Field”的自定义控件,该控件继承自ContentControl,它包含一个Grid和一个label来显示字段标签,以及一个ContentPresenter来根据我们想要编辑的数据放置控件 然后我创建了一个名为“TextField”的自定义控件,该控件继承自Field,应该在内容中放入TextBox 以下是Generic.xaml中的样式: <Style TargetType="{x:Type controls:Field}"> <Setter Pr

我创建了一个名为“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
时仅显示文本框。但是,我如何通过保持控件的其余部分继承父样式来设置内容的样式(例如本例中的文本框)


我知道我可以为每个派生控件重写整个控件,但这违反了继承原则,不是吗?这意味着重复的代码(此处为重复标记),如果我更改父“字段”中的任何内容,我将不得不在每个子控件中更改它,并有出错的风险…

将父控件的
内容
属性设置为
文本框的一个实例,您可以根据需要设置样式:

<controls:Field Background="Gray">
    <TextBox Grid.Column="1" MaxLines="1" TextWrapping="NoWrap" />
</controls:Field>

这就是
ContentControl
的使用方式

您不能仅覆盖
控制模板的一部分


你自己说要将文本框放入内容中,但随后你将其放入模板中,覆盖所有内容。