2011-01-14 17 views

Respuesta

5

Trate de hacer esto:

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

Luego de usarlo,

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

Gracias, eso me ha dado una ventaja! – devdigital

+0

Este ejemplo funciona bien. Sin embargo, hay un pequeño cambio en el siguiente método. Debe llamar al método 'GetClickKeyboardFocusTarget' en lugar de' GetKeyboardClickFocusTarget': vacío estático privado OnButtonClick (remitente del objeto, RoutedEventArgs e) {var target = GetKeyboardClickFocusTarget ((ButtonBase) remitente); Teclado.Enfoque (objetivo); } –