模拟XAML代码继承的最佳方法是什么?

时间:2009-05-25 11:37:44

标签: wpf xaml

我有许多UserControl类:

  • DataTypeWholeNumber
  • DataTypeLine
  • DataTypeDate
  • DateTypeDuration

它们都继承自一个普通的C#类,该类继承自没有连接XAML的UserControl。我不得不这样做,因为我收到错误,说XAML无法继承

问题是每个UserControl的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 个答案:

答案 0 :(得分:2)

使用适用于基类的样式:

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

另外,我质疑每个其中一个基本类型的UserControls的问题 - 为什么不能在任何地方重用相同的UserControl?

答案 1 :(得分:0)

XAML类不能从XAML类继承,但普通类可以从XAML类继承 - 所以如果所有这些的XAML都相同,那么将XAML放在BaseDataType中并将所有派生类型放入正常状态非WPF c#类。

如果您需要从BaseDataType派生其他XAML用户控件,那么这是不可能的,但您可以使用样式,数据模板或控件模板在不同控件之间共享XAML。