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

5
我有多个UserControl类:
  • DataTypeWholeNumber
  • DataTypeLine
  • DataTypeDate
  • DateTypeDuration
  • 等等。
它们都继承自一个普通的C#类,该类继承自UserControl,但没有附加XAML。我不得不这样做,因为我收到了“无法继承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个回答

1

使用适用于基类的样式:

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

此外,我对于每种基本类型都需要使用UserControls的必要性提出疑问 - 为什么不能在所有地方重用相同的UserControl呢?

我想为每种数据类型创建一个类的原因是,例如对于更复杂的数据类型,如客户或合同,不仅会显示一个文本框,而且还会有下拉菜单、三个文本框等等,以及特定于该数据类型的触发器和动画等等,这些在其他数据类型中没有。 - Edward Tanguay
1
@Edward,你可能想要查看ContentPresenter和可能的DataTemplateSelector,以便在标准控件内具有可变内容的方式。WPF控件设计鼓励您优先考虑组合而不是继承。 - Dan Bryant

0
一个 XAML 类不能从另一个 XAML 类继承,但是普通类可以从 XAML 类继承。所以,如果所有这些的 XAML 是相同的,请将该 XAML 放在 BaseDataType 中,并将所有派生类型创建为普通的非 WPF C# 类。
如果您需要从 BaseDataType 派生其他 XAML 用户控件,则这是不可能的,但是您可以使用样式、数据模板或控件模板来共享不同控件之间的 XAML。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接