Могу ли я иметь один стиль с несколькими TargetType в WPF? - PullRequest
28 голосов
/ 10 февраля 2012

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

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

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

Ответы [ 5 ]

49 голосов
/ 10 февраля 2012

Нет, вы не можете, однако я часто создаю стиль для общего базового класса, например 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}}" />
8 голосов
/ 24 сентября 2014

Более гибкий вариант ответа Рэйчел - использовать 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 в качестве целевого типа.

2 голосов
/ 28 ноября 2017

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

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

То же, что и:

<Style TargetType="{x:Type Label}">
    <!-- Shared Setters -->
</Style>
2 голосов
/ 10 февраля 2012

Ответ - нет.

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

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

0 голосов
/ 14 марта 2014

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

См. Этот код:

<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>

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

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

...