如何在DataForm中将焦点放在TextBox上?

4

我有一个小的DataForm,我想将焦点设置在第一个TextBox上。我使用的是2009年11月的工具包。我已经为TextBox命名,并尝试在DataForm的loaded事件中使用.Focus()。我看到它获得了一次光标“闪烁”的焦点,然后就消失了。我正在努力确定这是否是DataForm的副作用还是其他原因。有人知道我是否能够做到这一点吗?


我有同样的问题。在 CodePlex 项目页面上创建了一个问题:http://silverlight.codeplex.com/workitem/8365 - Olivier Payen
3个回答

1

我尝试了许多在各种互联网站上流传的建议,例如使用Dispatcher、UpdateLayout等等,但它们都不能可靠地工作。最终,我选择了以下方法:

private bool _firstTime = true;

    private void MyChildWindow_GotFocus(object sender, RoutedEventArgs e)
    {
        if (_firstTime)
        {
            try
            {
                var dataForm = MyDataForm;
                var defaultFocus = dataForm.FindNameInContent("Description") as TextBox;
                defaultFocus.Focus();
            }
            catch (Exception)
            {
            }
            finally
            {
                _firstTime = false;
            }
        }
    }

虽然不太美观,但它能用。在SL4中使用Focus()方法似乎存在时间问题。


这对我有用。关键是在GotFocus事件中将焦点设置在正确的TextBox上。 - Steve Wranovsky

1
我成功使用的一个小技巧是订阅文本框的Loaded事件,然后在事件处理程序中,使用以下代码设置焦点:
private void TextBox_Loaded(object sender, RoutedEventArgs e)
{
            TextBox usernameBox = (TextBox)sender;
            Dispatcher.BeginInvoke(() => { usernameBox.Focus(); });
}

0

尝试调用我的自定义焦点设置函数(FocusEx)。

internal static class ControlExt 
{ 
    // Extension for Control 
    internal static bool FocusEx(this Control control) 
    { 
        if (control == null) 
                return false; 

        bool success = false; 
        if (control == FocusManager.GetFocusedElement()) 
                success = true; 
        else 
        { 
                // To get Focus() to work properly, call UpdateLayout() immediately before 
                control.UpdateLayout(); 
                success = control.Focus(); 
        } 

        ListBox listBox = control as ListBox; 
        if (listBox != null) 
        { 
                if (listBox.SelectedIndex < 0 && listBox.Items.Count > 0) 
                        listBox.SelectedIndex = 0; 
        } 

        return success; 
    } 
} 

这应该对你有用。

吉姆·麦卡迪

阴阳钱


谢谢您的建议。我已经尝试过了,但是没有帮助:我得到了相同的结果。TextBox 短暂地获得焦点,然后失去了焦点。如果我注释掉 .Focus() 或者使用您的代码中的 .FocusEx() 语句,它根本就不会获得焦点,所以我知道它们一开始就起作用了。还有其他东西必须在抢夺它,但我不知道如何找出是什么。 - serialhobbyist

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