如标题所示,我的意思如下:
<Style TargetType="{x:Type TextBlock}"
TargetType="{x:Type Label}"
TargetType="{x:Type Button}" >
这实际上是为了使用 3rd 方控件,我继承了他们的类。但是模板不适用于子类,因为TargetType
它在基类上。所以我想设置多个TargetType
s 让它能够同时申请。
如标题所示,我的意思如下:
<Style TargetType="{x:Type TextBlock}"
TargetType="{x:Type Label}"
TargetType="{x:Type Button}" >
这实际上是为了使用 3rd 方控件,我继承了他们的类。但是模板不适用于子类,因为TargetType
它在基类上。所以我想设置多个TargetType
s 让它能够同时申请。
不,你不能,但是我经常为共享基类创建一个样式,例如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}}" />
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 作为目标类型。
答案是不。
TargetType
是 Style 的一个属性,只能设置一次。为确保类型安全,样式应针对特定类型,以便了解要设置的属性。
但是,有一个解决方法。您可以采用所有类型的通用属性并以一种样式定义它们。然后为每个特定控件制作特定样式,并使用该BasedOn
属性从基本样式继承。
根据 Rachel 的回答,为了更简洁的代码,您可以删除标记扩展中的 x:Type 并仅使用类型:
<Style TargetType="Label">
<!-- Shared Setters -->
</Style>
是相同的:
<Style TargetType="{x:Type Label}">
<!-- Shared Setters -->
</Style>
实际上我发现在网格中你只能设置一个项目的样式。但是,在堆栈面板中,您可以设置多个项目的样式。
请参阅此代码:
<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>
如果您要删除它下方的位置并更改为,您将看到未设置对象,仅更改了最后一个对象的属性。
希望这可以帮助。