2010-06-14 23 views
11

Ich möchte einen Stil auf alle Bedienelemente meine TextBox setzen, die die folgenden, wenn es den Tastaturfokus erhält:Funktionsaufruf innerhalb von XAML-Code?

1)
2) Rufen Sie .SelectAll die Hintergrundfarbe ändern() den gesamten Text zu markieren

ich habe dies so weit:

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

gibt es eine Möglichkeit auch .SelectAll() zu nennen? Vielen Dank.

Antwort

19

Sie können dies mithilfe angehängter Verhaltensweisen tun.

Beispiel

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(); 
    } 
} 

Usage

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

Referenzen

NB: War nicht in der Lage, die obige Implementierung zu testen, obwohl es eigentlich funktionieren sollte.

HTH,

+3

+1 Ausgezeichnete Antwort. Fast genau das, was ich geschrieben hätte. Persönlich würde ich den Körper der Methode zu einfach '((TextBoxBase) target) .SelectAll()' ändern, um eine verständliche Ausnahme zu werfen, wenn die Eigenschaft irrtümlich verwendet wird. Aus Sicht der Qualitätssicherung ist dies auf lange Sicht besser, als solche Fehler stillschweigend zu ignorieren: Sie fangen Ihre Fehler im Voraus, anstatt sie jahrelang verborgen zu halten. –

+0

@Ray Burns: Ich stimme zu. Es ist eine schlechte Angewohnheit, von der ich versuche wegzukommen. Ich habe meine Antwort bearbeitet. – Dennis

+0

Danke dafür - es hat perfekt funktioniert. FYI, für alle, die dies für eine PasswordBox implementieren möchten: Implementieren Sie eine separate PasswordBoxBehaviour-Klasse und ersetzen Sie alle Vorkommen von TextBoxBase durch PasswordBox. – BCA

Verwandte Themen