2016-04-13 75 views
1

我想在用戶輸入焦點時在我的Textbox周圍有一個漂亮的小橙色邊框。WPF文本框邊框樣式觸發器IsFocused只適用於具有焦點但不具有鍵盤焦點

我定義了我認爲需要的TIGERS的樣式,但有一個奇怪的行爲。

當光標位於TextBox並且WPF應用程序具有焦點時,它具有藍色邊框。

但是,當光標聚焦,我點擊應用程序外(如在視覺工作室),它變成了橙色。

我試過重寫許多觸發器,但無濟於事。

這是當我專注於文本,但我專注於其他應用程序會發生什麼:

Focus but outside of app

這是文本框W /聚焦在應用程序:

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> 

回答

3

看看默認的文本框樣式這裏: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(你可以使用上面鏈接提供的默認模板並覆蓋一些顏色)。

相關問題