19
votes

I have a usercontrol loaded inside a canvas; this usercontrol on default have visibility collapsed. When a specific textbox of my window is focused the usercontrol become visible.

When usercontrol become visible I want set focus to another textbox inside usercontrol.

I try to do that:

private void UserControl_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
{
        if (this.Visibility == Visibility.Visible)
        {                
            FocusManager.SetFocusedElement(this, TextBlockInput);
        }
}

It seems work but there is a problem: the textbox seems focused but the cursor into textbox don't blink and I can't type chars for input.

I would that after focus the textbox is ready for input. How can I do?

3

3 Answers

38
votes

Well, I solve in this way:

private void UserControl_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
{
    if (this.Visibility == Visibility.Visible)
    {
        this.Dispatcher.BeginInvoke((Action)delegate
        {
            Keyboard.Focus(TextBlockInput);
        }, DispatcherPriority.Render);
    }
}

I think that the problem was tha focus call into IsVisibleChanged event "scope"...right?

1
votes

try

Keyboard.Focus(TextBlockInput);

see here for more details

-1
votes

Another possible workaround is instead of Visibility property use Opacity. In this case calling Focus() actually sets focus.