2017-03-07 64 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

回答