Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Is there a way to set Focus from one control to another using WPF Triggers?

Like the following example:

<Page   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">   <Grid>       <Grid.RowDefinitions>       <RowDefinition/>       <RowDefinition/>       <RowDefinition/>     </Grid.RowDefinitions>      <TextBox Name="txtName"></TextBox>         <TextBox Grid.Row="1" Name="txtAddress"></TextBox>     <Button Grid.Row="2" Content="Finish">         <Button.Triggers>             <EventTrigger RoutedEvent="Button.Click">                  <!-- Insert cool code here-->                </EventTrigger>         </Button.Triggers>     </Button>   </Grid> </Page> 

Is there a way for this EventTrigger to put to focus on the textBox "txtName"?

I am trying to find the way to do something like this using strict MVVM. If this is something that should not be done via the XAML (in MVVM) then that is fine. But I would like to see some kind of documentation as to how it fit in the MVVM pattern doing it outside the XAML.

like image 326
Vaccano Avatar asked Feb 04 '10 23:02

Vaccano


2 Answers

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" /> 
like image 177
Ian Oakes Avatar answered Oct 14 '22 02:10

Ian Oakes


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.

like image 25
caesay Avatar answered Oct 14 '22 00:10

caesay