6
votes

I want that from the PreviewTextInput handler a new control is created and focus is set to it. But even after calling Focus() on the new control, the cursor is still in the old textbox. The handler UserControl_PreviewTextInput is registered on the UserControl which contains this textbox if this matters.

private void UserControl_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
            CodeLineControl el = new CodeLineControl();
            container.Children.Insert(idx+1, el);
            el.innerTextBox.Focus();
}

CodeLineControl is defined like that(simplified):

<UserControl ..>
    <DockPanel Name="codeline"  Background="AntiqueWhite" >           
         <TextBox Name="innerTextBox"/>      
    </DockPanel>  
</UserControl>

Are there some limitations on Focus() that Iam not awre about? Am I not allowed to move Focus() away from a TextBox from a PreviewTextInput handler? Can't I set the focus on newly created elements?

2

2 Answers

18
votes

This is the extension method I use for instead of Focus:

    public static void BackgroundFocus(this UIElement el)
    {
        Action a = () => el.Focus();
        el.Dispatcher.BeginInvoke(DispatcherPriority.Background, a);
    }

No need to create a timer.

3
votes

Create a DispatcherTimer that calls Focus on that textbox after a delay