2010-11-08 12 views
5

He notado un comportamiento extraño de TextBox mientras que la propiedad BorderThickness está establecida en 1 - el foco hace que el borde cambie el color (a algo como blanco). Sin embargo, si configuro el grosor del borde en algo diferente de 1, digamos .99 o 1.01, el problema desaparece.BorderThickness de TextBox en WPF (¿error?)

¿Es el error en WPF? ¿O es intencional?

+0

¿Cuál es el conjunto de DPI de su adaptador de video? ¿SnapToDevicePixels tiene un efecto? –

+0

Creo que puedo reproducir esto. Si tiene un TextBox y se enfoca, el borde cambia de color. Sin embargo, si BorderThickness es algo más que "1", esto no sucede. Nunca he visto esto, no creo que alguna vez haya configurado BorderThickness de un TextBox antes. (+1) –

+0

@Hans, creo que SnapToDevicePixels no tiene ningún efecto razonable. Los problemas ocurren solo si TextBox obtiene el foco clave (es decir, uno está escribiendo y el mouse se mueve sobre el TextBox). – Jamie

Respuesta

1

Este es el comportamiento predeterminado del estilo Aero para TextBoxes. Para deshabilitarlo, necesitarás volver a escribir el TextBox. Puede tomar los estilos predeterminados desde here (ver Descargar muestra).

En el Estilo predeterminado para TextBoxBase (en el que se basa TextBox), verá que usa un ListBoxChrome. Este elemento se define en el ensamblado Presentation.Aero y es responsable de mostrar el aspecto "centrado". Simplemente puede eliminar la configuración de RenderFocus y posiblemente RenderMouseOver, o reemplazarla por un borde.

Luego, querrá incluir eso en los recursos de su aplicación.

<LinearGradientBrush x:Key="TextBoxBorder" 
     StartPoint="0,0" EndPoint="0,20" MappingMode="Absolute"> 
    <LinearGradientBrush.GradientStops> 
     <GradientStop Color="#ABADB3" Offset="0.05" /> 
     <GradientStop Color="#E2E3EA" Offset="0.07" /> 
     <GradientStop Color="#E3E9EF" Offset="1" /> 
    </LinearGradientBrush.GradientStops> 
</LinearGradientBrush> 

<Style x:Key="{x:Type TextBoxBase}" TargetType="{x:Type TextBoxBase}" BasedOn="{x:Null}"> 
    <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" /> 
    <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}" /> 
    <Setter Property="BorderBrush" Value="{StaticResource TextBoxBorder}" /> 
    <Setter Property="BorderThickness" Value="1" /> 
    <Setter Property="Padding" Value="1" /> 
    <Setter Property="AllowDrop" Value="true" /> 
    <Setter Property="FocusVisualStyle" Value="{x:Null}" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type TextBoxBase}"> 
       <Border x:Name="Bd" BorderThickness="{TemplateBinding BorderThickness}" 
         BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}" 
         SnapsToDevicePixels="true"> 
        <ScrollViewer x:Name="PART_ContentHost" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" /> 
       </Border > 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsEnabled" Value="false"> 
         <Setter TargetName="Bd" Property="Background" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" /> 
         <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" /> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
<Style x:Key="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBoxBase}}" TargetType="{x:Type TextBox}"/> 

Si nos fijamos en la clase ListBoxChrome en el reflector (específicamente el método OnRender), se puede ver que sólo hará que la mirada fija si es BorderThickness es "1,1,1,1".