15

可以说我有以下内容:

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

这工作正常,这里没有什么太大的问题,但这是一个相当简单的案例。如果我想将 IsFocused 样式状态列为显式样式会发生什么情况,如何将该样式引用为 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>
4

4 回答 4

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>

我没有看到其他解决方案:(

于 2009-07-26T07:59:07.503 回答
9

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

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

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

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

然后为 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>

托尼

于 2012-03-19T18:02:45.260 回答
8

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

<TextBox FocusVisualStyle="{StaticResource ActiveStyle}" .....

或者使用设置器的另一种方式

<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>
于 2009-07-26T08:22:20.950 回答
0

我的情况涉及需要在按钮的视图框中显示锁定/解锁图标图像。不幸的是,视图框上没有 Content 的直接属性。根据@Tony 的上述回复,这是一个工作示例,其中包含他对我的情况的回答。

<Button Padding="5 0" Margin="0" Cursor="Hand" Style="{StaticResource IconButton}">
    <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center" >
        <Viewbox Stretch="Fill" Height="20" Width="20">
            <ContentControl >
                <ContentControl.Resources>
                    <ControlTemplate x:Key="Open" TargetType="ContentControl">
                        <ContentControl Style="{StaticResource LockOpenIcon}" />
                    </ControlTemplate>
                    <ControlTemplate x:Key="Closed" TargetType="ContentControl">
                        <ContentControl Style="{StaticResource LockClosedIcon}" />
                    </ControlTemplate>
                </ContentControl.Resources>
                <ContentControl.Style>
                    <Style TargetType="{x:Type ContentControl}" >
                        <Setter Property="Template" Value="{StaticResource Open}" />
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding Path=WorkflowAccessibility, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}" Value="{x:Static da:GatewayWorkflowAccessibility.VisibleDisabled}">
                                <Setter Property="Template" Value="{StaticResource Closed}" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </ContentControl.Style>
            </ContentControl>
        </Viewbox>
    </StackPanel>
</Button>
于 2020-08-18T16:55:50.413 回答