31

如标题所示,我的意思如下:

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

这实际上是为了使用 3rd 方控件,我继承了他们的类。但是模板不适用于子类,因为TargetType它在基类上。所以我想设置多个TargetTypes 让它能够同时申请。

4

5 回答 5

55

不,你不能,但是我经常为共享基类创建一个样式,例如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}}" />
于 2012-02-10T19:10:05.073 回答
10

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 作为目标类型。

于 2014-09-24T12:39:08.937 回答
2

答案是不。

TargetType是 Style 的一个属性,只能设置一次。为确保类型安全,样式应针对特定类型,以便了解要设置的属性。

但是,有一个解决方法。您可以采用所有类型的通用属性并以一种样式定义它们。然后为每个特定控件制作特定样式,并使用该BasedOn属性从基本样式继承。

于 2012-02-10T19:08:39.520 回答
2

根据 Rachel 的回答,为了更简洁的代码,您可以删除标记扩展中的 x:Type 并仅使用类型:

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

是相同的:

<Style TargetType="{x:Type Label}">
    <!-- Shared Setters -->
</Style>
于 2017-11-28T13:37:25.290 回答
0

实际上我发现在网格中你只能设置一个项目的样式。但是,在堆栈面板中,您可以设置多个项目的样式。

请参阅此代码:

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

如果您要删除它下方的位置并更改为,您将看到未设置对象,仅更改了最后一个对象的属性。

希望这可以帮助。

于 2014-03-14T17:48:28.753 回答