Подтвердить что ты не робот

Могу ли я иметь один стиль с несколькими TargetType в WPF?

Как указано, и я имею в виду что-то вроде ниже:

<Style TargetType="{x:Type TextBlock}" 
       TargetType="{x:Type Label}"  
       TargetType="{x:Type Button}" >

Это фактически ради использования стороннего элемента управления, я унаследовал их класс. Но шаблон не применяется к SubClass, потому что TargetType находится в базовом классе. Поэтому я хотел бы установить несколько TargetType, чтобы он мог применяться для обоих.

4b9b3361

Ответ 1

Нет, вы не можете, однако я часто создаю стиль для общего базового класса, такого как FrameworkElement, а затем создаю отдельные стили управления, которые BasedOn базовый стиль

<Style TargetType="{x:Type FrameworkElement}">
    <!-- Shared Setters -->
</Style>

<Style TargetType="{x:Type TextBlock}" BasedOn="{StaticResource {x:Type FrameworkElement}}" />
<Style TargetType="{x:Type Label}" BasedOn="{StaticResource {x:Type FrameworkElement}}" />
<Style TargetType="{x:Type Button}" BasedOn="{StaticResource {x:Type FrameworkElement}}" />

Ответ 2

Более гибкая вариация ответа Rachel заключается в использовании resourceKey для BasedOn.

Итак, вместо:

<Style TargetType="{x:Type FrameworkElement}">
    <!-- Shared Setters -->
</Style>
<Style TargetType="{x:Type TextBlock}" BasedOn="{StaticResource {x:Type FrameworkElement}}" />


Сделайте что-то вроде:

<Style x:Key="commonStyle" TargetType="{x:Type FrameworkElement}">
    <!-- Shared Setters -->
</Style>
<Style TargetType="{x:Type TextBlock}" BasedOn="{StaticResource commonStyle}" />


Это дает больше возможностей, поскольку некоторые стили могут быть основаны на commonStyle, а некоторые на, например, commonStyle2, где как commonStyle, так и commonStyle2 имеют FrameworkElement в качестве целевого типа.

Ответ 3

Ответ - нет.

TargetType является свойством стиля и может быть установлен только один раз. Чтобы застраховать тип safty, стиль должен быть нацелен на определенный тип, чтобы знать, какие свойства следует устанавливать.

Однако есть работа. Вы можете использовать общие свойства всех типов, которые у вас есть, и определять их в одном стиле. Затем создайте конкретные стили для каждого из конкретных элементов управления и используйте свойство BasedOn для наследования основного стиля.

Ответ 4

Основываясь на ответе Рейчел, для более чистого кода вы можете удалить x: Type в расширении разметки и просто использовать Type:

<Style TargetType="Label">
    <!-- Shared Setters -->
</Style>

То же, что и:

<Style TargetType="{x:Type Label}">
    <!-- Shared Setters -->
</Style>

Ответ 5

На самом деле я узнал, что в сетке вы можете установить стиль только одного элемента. Однако в стеке панели вы можете установить стиль нескольких элементов.

Смотрите этот код:

<Grid>        
    <StackPanel>
        <StackPanel.Resources>
            <Style TargetType="TextBlock">
                <Setter Property="FontSize" Value="12"></Setter>
                <Setter Property="VerticalAlignment" Value="Center"></Setter>
                <Setter Property="HorizontalAlignment" Value="Center"></Setter>
                <Setter Property="Margin" Value="5"></Setter>
            </Style>
            <Style TargetType="TextBox">
                <Setter Property="Width" Value="100"></Setter>
                <Setter Property="Height" Value="25"></Setter>
                <Setter Property="Margin" Value="5"></Setter>
            </Style>
            <Style TargetType="Button">
                <Setter Property="Margin" Value="5"></Setter>
                <Setter Property="Height" Value="30"></Setter>
                <Setter Property="Width" Value="100"></Setter>
            </Style>
        </StackPanel.Resources>
        <StackPanel Orientation="Horizontal">
            <TextBlock>Kanban ID</TextBlock>
            <TextBox></TextBox>
        </StackPanel>
        <StackPanel Orientation="Horizontal">
            <TextBlock>Customer Name</TextBlock>
            <TextBox></TextBox>
        </StackPanel>            
        <Button>Save</Button>
    </StackPanel>
</Grid>

Если вы хотите удалить место, расположенное ниже и измените, вы увидите, что объекты не установлены, изменены только последние свойства объекта.

Надеюсь, это поможет.