2010-06-14 25 views
11

me gustaría establecer un estilo en todos mis controles de cuadro de texto que hace lo siguiente cuando se selecciona con el teclado:Llamada de función dentro del código XAML?

1) Cambiar el color de fondo
2) Llama .SelectAll() para resaltar todo el texto

tengo esto hasta ahora:

<Style TargetType="TextBox"> 
<Style.Triggers> 
      <Trigger Property="IsKeyboardFocusWithin" Value="True"> 
       <Setter Property="Background"> 
        <Setter.Value> 
         <SolidColorBrush Color="#FFFFD1D9"/> 
        </Setter.Value> 
       </Setter> 
      </Trigger> 
</Style.Triggers> 
</Style> 

¿hay una manera de llamar también .SelectAll()? Gracias.

Respuesta

19

Puede hacerlo utilizando comportamientos adjuntos.

Ejemplo

public static class TextBoxBehaviour 
{ 
    public static bool GetSelectAll(TextBoxBase target) 
    { 
     return (bool)target.GetValue(SelectAllAttachedProperty); 
    } 

    public static void SetSelectAll(TextBoxBase target, bool value) 
    { 
     target.SetValue(SelectAllAttachedProperty, value); 
    } 

    public static readonly DependencyProperty SelectAllAttachedProperty = DependencyProperty.RegisterAttached("SelectAll", typeof(bool), typeof(TextBoxBehaviour), new UIPropertyMetadata(false, OnSelectAllAttachedPropertyChanged)); 

    static void OnSelectAllAttachedPropertyChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) 
    { 
     ((TextBoxBase)o).SelectAll(); 
    } 
} 

Uso

<Style TargetType="{x:Type TextBox}" xmlns:behaviours="clr-namespace:Controls.Behaviours"> 
    <Style.Triggers> 
     <Trigger Property="IsKeyboardFocusWithin" Value="True"> 
      <Setter Property="Background" Value="#FFFFD1D9"/> 
      <Setter Property="behaviours:TextBoxBehaviour.SelectAll" Value="True"/> 
    </Trigger> 
    </Style.Triggers> 
</Style> 

Referencias

NB: No se pudo probar la implementación anterior, en teoría, aunque debería funcionar ™.

HTH,

+3

+1 Excellent answer. Casi exactamente lo que habría escrito. Personalmente, cambiaría el cuerpo del método simplemente por el destino '((TextBoxBase)) .SelectAll()' para arrojar una excepción inteligible si la propiedad se usa erróneamente. Desde el punto de vista de la garantía de calidad, esto es mejor a la larga que ignorar silenciosamente tales errores: captas tus errores por adelantado en lugar de tenerlos escondidos durante años. –

+0

@ Ray Burns: estoy de acuerdo. Es un mal hábito del cual estoy tratando de alejarme. He editado mi respuesta. – Dennis

+0

Gracias por eso, funcionó perfectamente. FYI, para cualquiera que desee implementar esto para PasswordBox: implemente una clase PasswordBoxBehaviour separada y reemplace todas las ocurrencias de TextBoxBase con PasswordBox. – BCA

Cuestiones relacionadas