2017-03-07 81 views
2

我已经创建了一个名为“域”的定制控件样式只是内容的一部分,从ContentControl继承和包含Gridlabel揭露字段标签和ContentPresenter允许把控制依赖关于我们想要编辑的数据。WPF子控件,

然后,我创建了一个名为“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当这种只显示一个文本框。但是,我怎样才能通过保持控件的其余部分继承父类型来设置内容的样式(例如本例中的TextBox)?

我知道我可以重写每个派生控件的整个控件,但是这违背了继承原则,不是?将意味着重复的代码(在这里重复标记),如果我改变任何在父“场”,我将不得不改变它在每个孩子控制,有错误的风险...

+0

你是在说自己关于把文本框为内容,但随后你将它放入模板覆盖一切。 – Evk

回答