当用户控件更改可见性时,将焦点集中在文本框上

22

我在Canvas中加载了一个UserControl;这个UserControl默认情况下是Collapsed的。当窗口中特定的文本框获得焦点时,该UserControl将变为可见状态。

当UserControl变为可见状态时,我想将焦点设置到UserControl内部的另一个文本框。

我尝试这样做:

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

看起来工作正常,但存在一个问题:文本框似乎已经聚焦了,但光标没有闪烁且我无法输入字符。

我希望在聚焦文本框后可以直接输入。该如何实现?

3个回答

42

我是这样解决的:

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

我认为问题在于焦点调用了IsVisibleChanged事件的“范围”...对吗?


今天早上一直在尝试解决这个问题...你救了我的晚上 :-) 非常感谢!! - Cris

1

尝试

Keyboard.Focus(TextBlockInput);

请查看这里获取更多细节。


我尝试过,但是使用Keyboard.Focus(myTextBox)或myTextBox.Focus()更糟糕了...似乎文本框没有被聚焦...看不到光标。 - Luca Petrini
这是一个标准的文本框吗?还是某个第三方控件? - Arsen Mkrtchyan
我已经发布了我的解决方案... 感谢帮助,看起来问题是在IsVisibleChange事件中调用焦点。 - Luca Petrini

-1
另一个可能的解决方法是,不使用Visibility属性,而是使用Opacity。在这种情况下,调用Focus()实际上会设置焦点。

1
这是一个错误的建议:Visilibity.CollapsedOpacity=0非常不同。逻辑/键盘焦点、鼠标事件触发、主题等方面都有所不同。Opacity关注的是美学,而Visibility关注的是可视树。 - Askolein
@Askolein 如我在回复中所述,这只是一个解决方法,而不是一个正确的解决方案。 - Pavels Ahmadulins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接