Каков наилучший способ эмулировать наследование кода XAML? - PullRequest
4 голосов
/ 25 мая 2009

У меня есть несколько классов UserControl:

  • DataTypeWholeNumber
  • DataTypeLine
  • DataTypeDate
  • DateTypeDuration
  • и т.д.

Все они наследуются от простого класса C #, который наследуется от UserControl, к которому не прикреплен XAML. Я должен был сделать это таким образом, поскольку я получал ошибок, говорящих, что 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 ]

2 голосов
/ 26 мая 2009

Используйте стиль, который применяется к базовому классу:

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

Кроме того, я подвергаю сомнению необходимость использования UserControls для каждого одного из базовых типов - почему вы не можете просто использовать один и тот же UserControl везде?

0 голосов
/ 06 июля 2009

Класс XAML не может наследовать от класса XAML, но нормальный класс может наследовать от класса XAML - поэтому, если XAML для всех из них совпадает, поместите этот XAML в BaseDataType и создайте все производные типы как нормальные не WPF c # классы.

Если вам нужно извлечь другие пользовательские элементы управления XAML из BaseDataType, это невозможно, но вы можете использовать стили, шаблоны данных или шаблоны элементов управления для совместного использования XAML между различными элементами управления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...