如何使Style.Triggers触发要应用的不同命名样式

vdh*_*ant 14 wpf setter triggers styles

可以说我有以下内容:

<Style TargetType="{x:Type TextBox}">
    <Setter Property="BorderThickness" Value="1" />
    <Setter Property="BorderBrush" Value="Gray" />
    <Style.Triggers>
        <Trigger Property="IsFocused" Value="true"> 
            <Setter Property="BorderBrush" Value="Green" />
            <Setter Property="BorderThickness" Value="2" />
        </Trigger>
    </Style.Triggers> 
</Style>
Run Code Online (Sandbox Code Playgroud)

这很好用,这里没有太多错误,但这是一个相当简单的案例.如果我想将IsFocused风格状态列为exsplicit风格,如何将该风格引用为IsFocused风格,即

<Style x:key="ActiveStyle" TargetType="{x:Type TextBox}">
    <Setter Property="BorderBrush" Value="Green" />
    <Setter Property="BorderThickness" Value="2" />
</Style>

<Style TargetType="{x:Type TextBox}">
    <Setter Property="BorderThickness" Value="1" />
    <Setter Property="BorderBrush" Value="Gray" />
    <Style.Triggers>
        <Trigger Property="IsFocused" Value="true">
           -- Here I want to reference ActiveStyle and not copy the copy the setters
        </Trigger>
    </Style.Triggers> 
</Style>
Run Code Online (Sandbox Code Playgroud)

Nic*_*ier 13

但是我不认为你可以这样重用一种风格:

<Style x:Key="ActiveStyle" TargetType="{x:Type TextBox}">
    <Style.Triggers>
        <Trigger Property="IsFocused" Value="true">
            <Setter Property="BorderBrush" Value="Green" />
            <Setter Property="BorderThickness" Value="2" />
        </Trigger>
    </Style.Triggers>
</Style>

<Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource ActiveStyle}">
    <Setter Property="BorderThickness" Value="1" />
    <Setter Property="BorderBrush" Value="Gray" />
</Style>
Run Code Online (Sandbox Code Playgroud)

我没有看到另一种解决方案:(


Job*_*Joy 8

WPF为此FrameworkElement.FocusVisualStyle提供了一个特殊属性所以继续并分配:)

<TextBox FocusVisualStyle="{StaticResource ActiveStyle}" .....
Run Code Online (Sandbox Code Playgroud)

或者使用setter的另一种方式

<Style TargetType="{x:Type TextBox}">
 <Setter Property="BorderThickness" Value="1" />
 <Setter Property="BorderBrush" Value="Gray" />    
 <Setter Property="FocusVisualStyle" >
  <Setter.Value>
    <Style x:key="ActiveStyle" TargetType="{x:Type TextBox}">
       <Setter Property="BorderBrush" Value="Green" />
       <Setter Property="BorderThickness" Value="2" />
    </Style>
   </Setter.Value>
  </Setter>
 </Style>
Run Code Online (Sandbox Code Playgroud)


Ton*_*ile 8

还有第三种方法可以做到这一点.

为您的控件创建两个命名控件模板:

<ControlTemplate x:Key="NotFocused" TargetType="{x:Type TextBox}">  
    . . .
</ControlTemplate>  

<ControlTemplate x:Key="Focused" TargetType="{x:Type TextBox}">   
    . . .
</ControlTemplate>
Run Code Online (Sandbox Code Playgroud)

然后为TextBox创建一个默认样式,其中包含触发器:

<Style TargetType="{x:Type TextBox}">   
    <Style.Triggers>
        <Trigger Property="IsFocused" Value="True">
            <Setter Property="Template" Value="{StaticResource Focused}" />
        </Trigger>
        <Trigger Property="IsFocused" Value="False">
            <Setter Property="Template" Value="{StaticResource NotFocused}" />
        </Trigger>
    </Style.Triggers>
</Style>
Run Code Online (Sandbox Code Playgroud)

托尼