2009-05-25 103 views
4

我有一些用戶控件類:模擬XAML代碼繼承的最佳方式是什麼?

  • DataTypeWholeNumber
  • DataTypeLine
  • DataTypeDate
  • DateTypeDuration

他們都來自一個普通的C#類繼承它繼承來自沒有附加XAML的UserControl。我必須這樣做,因爲我得到錯誤,說XAML不能繼承

的問題是,XAML中每個用戶控件,這些是基本相同,所以我想找到某種方式來至少效仿XAML繼承,這樣我就不必重複此代碼爲20的不同類:

<dataTypes:BaseDataType x:Class="TestDependencyProperty827.DataTypes.DataTypeLine" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:dataTypes="clr-namespace:TestDependencyProperty827.DataTypes"> 
    <StackPanel Margin="{Binding Margin}"> 
     <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="{Binding LabelWidth}"/> 
       <ColumnDefinition Width="*"/> 
      </Grid.ColumnDefinitions> 
      <StackPanel Grid.Column="0" Orientation="Horizontal"> 
       <TextBlock Text="{Binding Label}" FontSize="14"/> 
       <TextBlock FontSize="14" Text=":"/> 
      </StackPanel> 
      <TextBox Grid.Column="1" FontSize="12" HorizontalAlignment="Left" 
         Text="{Binding Text}" 
         Width="{Binding Width}"/> 
     </Grid> 
    </StackPanel> 
</dataTypes:BaseDataType> 

有沒有人遇到這個問題,並找到了解決辦法呢?

回答

2

使用適用於基類樣式:

<Style TargetType="BaseClass"> 
    <Setter Property="Control.Template"> 
     <Control.Value>   
      <StackPanel Margin="{Binding Margin}"> 
      <!-- Rest of code here --> 
     </Control.Value> 
</Style> 

此外,我質疑基本類型的每一個需要用戶控件 - 爲什麼你就不能重複使用相同的用戶控件無處不在?

+0

我想要每個DataType的類的原因是對於更復雜的數據類型,如客戶或合同,不僅僅是顯示文本框,還包括下拉菜單,三個文本框等,以及不包含其他數據類型的特定數據類型的觸發器和動畫等。 – 2009-05-27 10:18:24

+1

@Edward,您可能想要查看ContentPresenter和DataTemplateSelector,以瞭解在其他標準控件中可以擁有可變內容的方式。 WPF控件設計鼓勵你贊成構造而不是繼承。 – 2010-11-01 20:55:23

0

XAML類不能從XAML類繼承,但普通類可以從XAML類繼承 - 因此,如果所有這些的XAML都是相同的,則將Base類型中的XAML放入並將所有派生類型作爲正常的非WPF c#類。

如果您需要從BaseDataType派生其他XAML用戶控件而不是這樣做,但您可以使用樣式,數據模板或控件模板來在不同控件之間共享XAML。

相關問題