2

I wish to set focus on a TextBox after an item is selected from a ListView control, but I can't seem to get it to focus from within my 'SelectionChanged' event method FocusOnTextBox().

For some reason the ListView always has focus after a selection is made.

I have created a Visual Studio application to demonstrate this problem:

http://maq.co/focusapp.zip

How can I get the focus to return to the TextBox from within my 'SelectionChanged' event method?

MainWindow.xaml:

<Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition /> <ColumnDefinition /> </Grid.ColumnDefinitions> <ListView Name="list_view1" Grid.Column="0" SelectionChanged="FocusOnTextBox"> <ListViewItem Content="1" /> <ListViewItem Content="2" /> <ListViewItem Content="3" /> </ListView> <TextBox Name="text_box1" Grid.Column="1" Text="When a selection is chosen from the left hand side ListView, I want THIS word to be selected and for the focus to change to this text box - this will show the selection to the user.&#x0a;&#x0a;However, right now it doesn't seem to work, the focus remains on the ListView regardless of it being set to Focus() in the FocusOnTextBox() method, which is fired on the 'SelectionChanged' event." TextWrapping="Wrap" /> </Grid> </Window> 

MainWindow.xaml.cs:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace WpfApplication1 { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); // Test that the selection of the word THIS and the Focus() works text_box1.SelectionStart = 68; text_box1.SelectionLength = 4; text_box1.Focus(); } private void FocusOnTextBox(object sender, SelectionChangedEventArgs e) { MessageBox.Show("FocusOnTextBox fired on selection with list view"); text_box1.SelectionStart = 68; text_box1.SelectionLength = 4; text_box1.Focus(); } } } 

1 Answer 1

2

I believe this happens because the ListView is not finished changing the selection, and so you switching focus from within the SelectionChanged event handler doesn't stick because after you've changed focus, the ListView changes it back in order to complete its selection change flow.

If you put a breakpoint in the FocusOnTextBox function and look at the Call Stack, you'll see that you're pretty deep into the stack, and there is a lot that the ListView will do after your FocusOnTextBox function executes. I imagine one of the things it will do is set focus to the selected item in the ListView.

If you change it so that you're shifting focus after the ListView has completed changing the current selection, it should work. For example, changing it so you switch focus in the MouseLeftButtonUp seems to work:

<ListView Name="list_view1" Grid.Column="0" MouseLeftButtonUp="FocusOnTextBox"> <ListViewItem Content="1" /> <ListViewItem Content="2" /> <ListViewItem Content="3" /> </ListView> 

And then you'll need to change the FocusOnTextBox event handler definition to use MouseEventArgs rather than SelectionChangedEventArgs as well.

Sign up to request clarification or add additional context in comments.

2 Comments

+1 Nice! This is exactly it, I was just fiddling with it locally and could not get it to set focus on the SelectionChanged event; there is also no way to cancel the event and no event preview; your solution is elegant in that you attach the focus change to the end of the internal list-view event firing order when a user clicks to change a selection. As I was fiddling with this, I checked your solution and it does indeed work very nicely!
Thanks @DavidKhaykin. I have wrestled a lot with Focus in WPF and it can get really hairy. Even knowing why in this case, I was struggling with how to explain it clearly, so hopefully it makes sense.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.