WPF TextBox边框样式触发器IsFocused仅在具有焦点但不具有键盘焦点时才有效

时间:2016-04-13 17:21:41

标签: wpf xaml triggers wpf-style

我希望在Textbox周围有一个漂亮的小橙色边框,而用户正在输入它(有焦点)。

我为我认为需要的跳跳器定义了样式,但是有一种奇怪的行为。

当光标在TextBox且WPF应用程序具有焦点时,它有一个蓝色边框。

但是当光标聚焦并且我在应用程序外部点击时(就像在视觉工作室中一样)它会变成橙色。

我已经尝试过多次尝试,但无济于事。

当我专注于文本框但我专注于另一个应用程序时会发生这种情况:

Focus but outside of app

这是应用程序中焦点的文本框:

Focused in the app

以下是代码:

CTRL Xaml:

   <TextBox Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" 
                                         Style="{StaticResource RegistrationTextbox}" 
                                         IsReadOnly="{Binding Path=IsFirstNameReadOnly}" Text="{Binding FirstName}"  BorderThickness="0.99">
                                        <b:Interaction.Triggers>
                                            <b:EventTrigger EventName="GotFocus">
                                                <b:InvokeCommandAction Command="{Binding GotFocusFirstNameCommand}" />
                                            </b:EventTrigger>
                                        </b:Interaction.Triggers>
                                    </TextBox>

样式:

  <Style x:Key="RegistrationTextbox" TargetType="{x:Type TextBox}">
    <Setter Property="FocusVisualStyle" Value="{x:Null}"/>

    <Style.Triggers>
        <Trigger Property="IsReadOnly" Value="true">
            <Setter Property="Background" Value="#f2f2f2"/>
            <Setter Property="BorderBrush" Value="#f2f2f2"/>
            <Setter Property="BorderThickness" Value="2"/>
        </Trigger>
        <Trigger Property="IsKeyboardFocused" Value="true">
            <Setter Property="BorderBrush" Value="Red"/>
            <Setter Property="BorderThickness" Value="2"/>
        </Trigger>
        <Trigger Property="IsFocused"  Value="True">
            <Setter Property="BorderBrush" Value="#FAA634"/>
            <Setter Property="BorderThickness" Value="2"/>
        </Trigger>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="BorderBrush" Value="#F8B963"/>
            <Setter Property="BorderThickness" Value="2"/>
        </Trigger>
    </Style.Triggers>        
</Style>

1 个答案:

答案 0 :(得分:3)

在这里查看默认的TextBox样式:https://msdn.microsoft.com/en-us/library/cc645061%28v=vs.95%29.aspx

你会注意到在ControlTemplate中有这个块:

     <Border x:Name="Border" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="1" Opacity="1" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}">
     <Grid>
           <Border x:Name="ReadOnlyVisualElement" Opacity="0" Background="#5EC9C9C9"/>
           <Border x:Name="MouseOverBorder" BorderThickness="1" BorderBrush="Transparent">
               <ScrollViewer x:Name="ContentElement" Padding="{TemplateBinding Padding}" BorderThickness="0" IsTabStop="False"/>
           </Border>
     </Grid>
     </Border>
     <Border x:Name="DisabledVisualElement" Background="#A5F7F7F7" BorderBrush="#A5F7F7F7" BorderThickness="{TemplateBinding BorderThickness}" Opacity="0" IsHitTestVisible="False"/>
     <Border x:Name="FocusVisualElement" BorderBrush="#FF6DBDD1" BorderThickness="{TemplateBinding BorderThickness}" Margin="1" Opacity="0" IsHitTestVisible="False"/>

您在此处看到只有一个Border的BorderBrush绑定到TextBox的BorderBrush属性。当控制进入聚焦状态时 - 另一个边界(FocusVisualElement)变得可见,并且因为它稍后在视觉树中被定位 - 它覆盖了常规边界。当控制进入禁用或只读状态时也是如此。所以你的风格设定者基本上没有效果。

现在,当您切换到另一个应用程序时 - TextBox不再考虑它的重点(请注意,它不仅仅使用IsFocused属性来确定)。因此它隐藏了FocusVisualElement,在这里您可以看到触发器应用的边框颜色。

长话短说 - 控制开发人员不必为每个可能的状态绑定到单个BorderBrush属性。他们本可以提供类似FocusedBorderBrush属性的东西,但他们没有 - 所以你必须覆盖TextBox的ControlTemplate(你可以使用上面链接提供的默认模板并覆盖一些颜色)。