WPF / XAML: установить стиль с другим типом TargetType? - PullRequest
0 голосов
/ 12 августа 2009

У меня есть ресурс внешнего стиля в словаре ресурсов, на который я ссылаюсь с помощью x: Key. Он имеет x: TargetType, указывающий цель (TextBlock). Возможно ли применить это к элементу управления, содержащему TextBlock, и у всех элементов TextBlock в этом элементе есть примененный стиль?

Спасибо, Роберт

Ответы [ 4 ]

4 голосов
/ 12 августа 2009

Самый простой способ сделать это - определить стиль в элементе управления, основанный на вашем внешнем ресурсе стилей, но не указывать x: Key, только TargetType.

<Style TargetType="{x:Type TextBlock}" BasedOn="{StaticResource SomeOtherStyle}">

Без ключа он будет применяться ко всем текстовым блокам в элементе управления.

1 голос
/ 12 августа 2009

Чтобы немного расширить другие комментарии. При использовании синтаксиса, как показал Брэндон:

<Style TargetType="{x:Type TextBlock}" BasedOn="{StaticResource SomeOtherStyle}">

BasedOn = "" - это, по сути, своего рода "наследование" стиля. Этот стиль будет иметь в качестве базового набора сеттеров те из стиля, на котором он основан. Это дает вам возможность дополнить стиль параметрами, которые применяются только в этом случае или, в зависимости от вашего случая, переопределить область применения стиля.

У вас есть стиль в вашем словаре как ключевой стиль, который может быть применен только явно. «Переопределив» свой стиль, как показал Брэндон, вы теперь можете переопределить область, не указав ключ, тем самым применив его ко всем элементам целевого типа в области действия этого стиля. Так что, если бы все ваши TextBlocks были в Grid, у вас могло бы быть что-то вроде этого:

<Grid.Resources>
<Style TargetType="{x:Type TextBlock}" BasedOn="{StaticResource MyBaseStyle}">                  
</Style>
</Grid.Resources>
0 голосов
/ 12 августа 2009

Я думаю, это то, что вы ищете:

Ваш пользовательский элемент управления "test":

<UserControl x:Class="WpfApplication4.test"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Height="300" Width="300">
    <Grid>
        <TextBlock>test</TextBlock>
    </Grid>
</UserControl>

Ваш документ по стилям "Res / Styles.xaml"

 <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style TargetType="{x:Type TextBlock}">
    <Style.Setters>
        <Setter Property="Foreground" Value="Blue" />
    </Style.Setters>
</Style>

Ваше главное окно или родитель:

<Window x:Class="WpfApplication4.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:uc="clr-namespace:WpfApplication4"
Title="Window1" Height="300" Width="300">
<Window.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Res/Styles.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Window.Resources>

<Grid>
    <uc:test></uc:test>
</Grid>

Текстовый блок в пользовательском элементе управления «test» теперь отображается с синим передним планом.

0 голосов
/ 12 августа 2009

Нет, но вы можете автоматически применять стиль ко всем элементам определенного типа, например:

<!-- Applies to all buttons in scope of this style -->
<Style x:Key="{x:Type Button}" TargetType="{x:Type Button}">
   ...
</Style>
...