Как передать фокус TextBox в DataForm?

У меня есть небольшая форма DataForm, и я хочу сосредоточить внимание на первом TextBox. Я использую инструментарий Novermber 2009 Toolkit. Я назвал TextBox и попытался использовать .Focus () из загруженного события DataForm. Я вижу, что он фокусируется на одном мигании курсора, а затем исчезает. Я пытаюсь разобраться, является ли это артефактом DataForm или чего-то еще. Кто-нибудь знает, смогу ли я это сделать?


person serialhobbyist    schedule 02.01.2010    source источник
comment
Вы когда-нибудь находили для этого решение?   -  person Myles J    schedule 24.01.2011
comment
У меня точно такая же проблема. На странице проекта codeplex возникла проблема: silverlight.codeplex.com/workitem/8365   -  person Olivier Payen    schedule 17.02.2011


Ответы (3)


Небольшой трюк, который я успешно использовал, - это подписаться на событие Loaded текстового поля, а затем в обработчике событий я установил фокус с помощью такого кода:

private void TextBox_Loaded(object sender, RoutedEventArgs e)
{
            TextBox usernameBox = (TextBox)sender;
            Dispatcher.BeginInvoke(() => { usernameBox.Focus(); });
}
person witters    schedule 21.12.2010

Я пробовал множество предложений, например. используя Dispatcher, UpdateLayout и т. д., плавающие на различных интернет-сайтах, и ни один из них не работал у меня надежно. В итоге остановился на следующем:

частный 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;
            }
        }
    }

Не очень хорошо, я знаю ... но это работает. Похоже, есть проблема с синхронизацией с использованием метода Focus () в SL4.

person Myles J    schedule 24.01.2011
comment
Это сработало для меня. Ключ состоит в том, чтобы установить фокус на правильный TextBox в событии GotFocus. - person Steve Wranovsky; 26.10.2011

Попробуйте вызвать мою функцию настройки пользовательского фокуса (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; 
    } 
} 

Это должно сработать для вас.

Джим МакКарди

YinYangMoney

person Jim McCurdy    schedule 12.01.2010
comment
Спасибо за предложение. Я пробовал, но это не помогло: получаю те же результаты. TextBox ненадолго фокусируется, а затем теряет его. Если я закомментирую .Focus () или, используя ваш код, оператор .FocusEx (), он вообще не получит фокуса, поэтому я знаю, что они работают с самого начала. Должно быть, это что-то еще ворует, но я не знаю, как понять, что это такое. - person serialhobbyist; 13.01.2010