我希望在Textbox
周围有一个漂亮的小橙色边框,而用户正在输入它(有焦点)。
我为我认为需要的跳跳器定义了样式,但是有一种奇怪的行为。
当光标在TextBox
且WPF应用程序具有焦点时,它有一个蓝色边框。
但是当光标聚焦并且我在应用程序外部点击时(就像在视觉工作室中一样)它会变成橙色。
我已经尝试过多次尝试,但无济于事。
当我专注于文本框但我专注于另一个应用程序时会发生这种情况:
这是应用程序中焦点的文本框:
以下是代码:
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>
答案 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(你可以使用上面链接提供的默认模板并覆盖一些颜色)。