2009-05-25 88 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。

相关问题