WPF - Set Focus when a button is clicked - No Code Behind WPF - Set Focus when a button is clicked - No Code Behind wpf wpf

WPF - Set Focus when a button is clicked - No Code Behind


Have you considered using an attached behaviour. They are simple to implement and use AttachedProperty's. Although it still requires code, this code is abstracted away in a class and be reused. They can eliminate the need 'code behind' and are often used with the MVVM pattern.

Try this one and see if it works for you.

public class EventFocusAttachment{    public static Control GetElementToFocus(Button button)    {        return (Control)button.GetValue(ElementToFocusProperty);    }    public static void SetElementToFocus(Button button, Control value)    {        button.SetValue(ElementToFocusProperty, value);    }    public static readonly DependencyProperty ElementToFocusProperty =        DependencyProperty.RegisterAttached("ElementToFocus", typeof(Control),         typeof(EventFocusAttachment), new UIPropertyMetadata(null, ElementToFocusPropertyChanged));    public static void ElementToFocusPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)    {        var button = sender as Button;        if (button != null)        {            button.Click += (s, args) =>                {                    Control control = GetElementToFocus(button);                    if (control != null)                    {                        control.Focus();                    }                };        }    }}

And then in your XAML do something like...

<Button     Content="Click Me!"     local:EventFocusAttachment.ElementToFocus="{Binding ElementName=textBox}"     /><TextBox x:Name="textBox" />


I'm not near visual studio so I can't actually try this right now, but off the top of my head, you should be able to do something like this:

FocusManager.FocusedElement="{Binding ElementName=txtName}">

Edit:

There is a followup question (asked more recently) about this here: How to set autofocus only in xaml? which contains this method, and a few different ideas on how to use it.


You could also use a WPF Behavior...

    public class FocusElementAfterClickBehavior : Behavior<ButtonBase>{    private ButtonBase _AssociatedButton;    protected override void OnAttached()    {        _AssociatedButton = AssociatedObject;        _AssociatedButton.Click += AssociatedButtonClick;    }    protected override void OnDetaching()    {        _AssociatedButton.Click -= AssociatedButtonClick;    }    void AssociatedButtonClick(object sender, RoutedEventArgs e)    {        Keyboard.Focus(FocusElement);    }    public Control FocusElement    {        get { return (Control)GetValue(FocusElementProperty); }        set { SetValue(FocusElementProperty, value); }    }    // Using a DependencyProperty as the backing store for FocusElement.  This enables animation, styling, binding, etc...    public static readonly DependencyProperty FocusElementProperty =        DependencyProperty.Register("FocusElement", typeof(Control), typeof(FocusElementAfterClickBehavior), new UIPropertyMetadata());}

Here is the XAML to use the behavior.

Include namespaces:

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" xmlns:local="clr-namespace:WpfApplication1"

Attach WPF Behavior to button and bind element you want to set focus to:

<Button Content="Focus" Width="75">    <i:Interaction.Behaviors>        <local:FocusElementAfterClickBehavior FocusElement="{Binding ElementName=CheckBoxComboBox, Mode=OneWay}"/>    </i:Interaction.Behaviors></Button><ComboBox x:Name="CheckBoxComboBox" HorizontalAlignment="Center" VerticalAlignment="Center" Width="120" Grid.Row="1"/>

So this way you have no code behind and it is reusable on any control that inherits from ButtonBase.

Hope this helps someone.