2016-04-13 18 views
1

Textbox sayfamın içinde küçük bir turuncu kenarlık kullanıyorum, kullanıcı yazıyor (Has Focus).WPF TextBox Kenarlık Stili Tetikleme IsFocused yalnızca odaklanıp odaklanmıyorsa çalışır.

Gereksinim duyduğum kaplanlar için stilleri tanımladım, ihtiyacım var, ama garip bir davranış var.

İmleç TextBox numaralı telefondayken ve WPF uygulamasının odaklandığı zaman, mavi bir kenarlığı vardır.

Ancak imleç odaklanmışken ve uygulamanın dışına tıklıyorum (görsel stüdyosunda olduğu gibi) turuncu olur.

Birçok tetikleyiciyi geçersiz kılmayı denedim ama boşuna.

Bu benim metin odaklanmak ama başka bir uygulama üzerinde odaklanmış olduğumda olur:

Focused in the app

:

Focus but outside of app

Bu app/odak w metin kutusu olduğu Ve işte buradaki kod:

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> 

Stiller:

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

cevap

3

burada varsayılan TextBox tarzı bir göz atın:

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

Burada bkz: https://msdn.microsoft.com/en-us/library/cc645061%28v=vs.95%29.aspx

Bu blok var ControlTemplate içinde olduğunu göreceksiniz Sadece bir Border's BorderBrush, TextBox'ın BorderBrush özelliğine bağlı. Kontrol odaklanmış duruma geçtiğinde - başka bir sınır (FocusVisualElement) görünür hale gelir ve daha sonra görsel ağaçta belirtildiği için - normal Sınırı kaplar. Denetim devre dışı bırakıldığında veya salt okunur durumdayken de aynı durum geçerlidir. Yani stil ayarlayıcılarınız temelde etkisizdir.

Artık başka bir uygulamaya geçtiğinizde - TextBox artık daha fazla odaklanmadığını düşünmüyor (bunu belirlemek için yalnızca IsFocused özelliğini kullanmadığını unutmayın). Bu yüzden FocusVisualElement öğesini gizler ve burada tetiğinizin uyguladığı kenarlık rengini görürsünüz.

Uzun öykü kısa denetleyicileri, olası her durum için tek bir BorderBrush özelliğine bağlamaya zorlanmaz. Onlar FocusedBorderBrush özelliği gibi bir şey vermiş olabilirdi, ama yapmadılar - bu yüzden TextBox'ın ControlTemplate üzerine yazmak zorundasınız (yukarıdaki bağlantı tarafından sağlanan varsayılan şablonu kullanabilir ve bazı renklerin üzerine yazabilirsiniz).