我可以在WPF中使用一个具有多个TargetType的样式吗?

时间:2012-02-10 18:51:51

标签: c# wpf silverlight targettype

标题为,我的意思如下:

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

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

5 个答案:

答案 0 :(得分:48)

不,你不能,但是我经常为共享基类创建一个样式,例如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}}" />

答案 1 :(得分:8)

Rachel的答案更灵活的变化是使用resourceKey for 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 :(得分:2)

答案是否定的。

TargetType是Style的属性,只能设置一次。为了确保类型安全,样式应该以特定类型为目标,以便知道要设置的属性。

然而,有一个解决方法。您可以获取所有类型的公共属性,并以一种样式定义它们。然后为每个特定控件创建特定样式,并使用BasedOn属性继承基本样式。

答案 3 :(得分:2)

根据Rachel的回答,为了更清晰的代码,你可以删除标记扩展中的x:Type,只需使用Type:

WinGetHandle

与:

相同
<?php
include('src/OAuth2/Server.php'); # make sure the path is correct.

class customServer extends Server {

  public __construct(($storage = array(), array $config = array(), array $grantTypes = array(), array $responseTypes = array(), TokenTypeInterface $tokenType = null, ScopeInterface $scopeUtil = null, ClientAssertionTypeInterface $clientAssertionType = null)) {  
    parent::_construct($storage, $config, $grantTypes, $responseTypes, $tokenType, $scopeUtil, $clientAssertionType);
  }
}

public function __destruct() {
  // run your cleanup SQL from here.
}

答案 4 :(得分: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>

如果您要移除它下方的位置并更改为您将看到没有设置对象,只会更改最后一个对象的属性。

希望这会有所帮助。