2010-06-14 19 views
11

Chciałbym ustawić styl na wszystkich moich kontroli tekstowe, które wykonuje następujące po otrzymaniu ostrość klawiatury:Wywołanie funkcji w kodzie XAML?

1) Zmiana koloru tła
2) Zaproszenie .SelectAll(), aby podświetlić cały tekst

mam to do tej pory:

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

Czy istnieje sposób również zadzwonić .SelectAll()? Dzięki.

Odpowiedz

19

Możesz to zrobić, korzystając z dołączonych zachowań.

Przykład

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

Zastosowanie

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

Odniesienia

NB: Nie udało się przetestować powyższej implementacji, teoretycznie jednak powinna działać tylko ™.

HTH,

+3

+1 Doskonała odpowiedź. Prawie dokładnie to, co bym napisał. Osobiście zmieniłbym treść metody po prostu w celu '((TextBoxBase) target) .SelectAll()' tak, aby rzucić zrozumiały wyjątek, jeśli właściwość jest używana błędnie. Z perspektywy kontroli jakości jest to lepsze na dłuższą metę niż ciche ignorowanie takich błędów: łapiesz swoje robaki z góry, zamiast ukrywać je przez lata. –

+0

@Ray Burns: Zgadzam się. To zły nawyk, od którego próbuję się odsunąć. Edytowałem swoją odpowiedź. – Dennis

+0

Dzięki za to - działało idealnie. FYI, dla każdego, kto chce zaimplementować to dla PasswordBox: zaimplementuj oddzielną klasę PasswordBoxBehaviour i zamień wszystkie wystąpienia TextBoxBase na PasswordBox. – BCA