2011-01-14 31 views
8

kullanarak WPF'de bir kontrol olarak ayarlama Görünümümde bir Düğmeyi tıklattığımda, bir TextBox'a ayarlamak için klavye odağı olmasını istiyorum. Ben herhangi bir codebehind kullanmak istemiyorum, bu yüzden herkes eklenmiş bir mülk veya benzer bir çözüm yazmış mıydı?Odağı, MVVM

cevap

5

bu deneyin:

public static class FocusBehavior 
{ 
    public static readonly DependencyProperty ClickKeyboardFocusTargetProperty = 
     DependencyProperty.RegisterAttached("ClickKeyboardFocusTarget", typeof(IInputElement), typeof(FocusBehavior), 
     new PropertyMetadata(OnClickKeyboardFocusTargetChanged)); 

    public static IInputElement GetClickKeyboardFocusTarget(DependencyObject obj) 
    { 
     return (IInputElement)obj.GetValue(ClickKeyboardFocusTargetProperty); 
    } 

    public static void SetClickKeyboardFocusTarget(DependencyObject obj, IInputElement value) 
    { 
     obj.SetValue(ClickKeyboardFocusTargetProperty, value); 
    } 

    private static void OnClickKeyboardFocusTargetChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) 
    { 
     var button = sender as ButtonBase; 
     if (button == null) 
      return; 

     if (e.OldValue == null && e.NewValue != null) 
      button.Click += OnButtonClick; 
     else if (e.OldValue != null && e.NewValue == null) 
      button.Click -= OnButtonClick; 
    } 

    private static void OnButtonClick(object sender, RoutedEventArgs e) 
    { 
     var target = GetKeyboardClickFocusTarget((ButtonBase)sender); 

     Keyboard.Focus(target); 
    } 
} 

Sonra kullanmak için,

<TextBox x:Name="TargetTextBox"/> 
<Button b:FocusBehavior.ClickKeyboardFocusTarget="{Binding ElementName=TargetTextBox}"/> 
+0

Teşekkürler, bu verdi bana bir başlangıç! – devdigital

+0

Bu örnek çalışıyor. Ancak, aşağıdaki yöntemde küçük bir değişiklik var. "GetKeyboardClickFocusTarget" yerine "GetClickKeyboardFocusTarget" yöntemini çağırmanız gerekir: özel statik boşluk OnButtonClick (nesne gönderen, RoutedEventArgs e) {var target = GetKeyboardClickFocusTarget ((ButtonBase) gönderen); Keyboard.Focus (hedef); } –