Установка начального фокуса для элемента управления в форме Silverlight с использованием вложенных свойств - PullRequest
1 голос
/ 17 декабря 2010

Я пытаюсь установить начальный фокус на элемент управления в форме Silverlight.Я пытаюсь использовать вложенные свойства, чтобы фокус можно было указать в файле XAML.Я подозреваю, что фокус устанавливается до того, как элемент управления будет готов принять фокус.Кто-нибудь может проверить это или предложить, как этот метод может работать?

Вот мой код XAML для TextBox

<TextBox x:Name="SearchCriteria" MinWidth="200" Margin ="2,2,6,2" local:AttachedProperties.InitialFocus="True"></TextBox>

Свойство определено в AttachedProperties.cs:

public static DependencyProperty InitialFocusProperty = 
    DependencyProperty.RegisterAttached("InitialFocus", typeof(bool), typeof(AttachedProperties), null);

public static void SetInitialFocus(UIElement element, bool value)
{
    Control c = element as Control;
    if (c != null && value)
        c.Focus();
}

public static bool GetInitialFocus(UIElement element)
{
    return false;
}

Когда я ставлю точку останова в методе SetInitialFocus, он срабатывает, и элемент управления действительно является желаемым TextBox, и он вызывает Focus.

Я знаю, что другие люди создавали поведение и такое для достиженияэто задание, но мне интересно, почему это не сработает.

1 Ответ

1 голос
/ 17 декабря 2010

Вы правы, элемент управления не готов к получению фокуса, поскольку еще не завершил загрузку.Вы можете добавить это, чтобы заставить его работать.

public static void SetInitialFocus(UIElement element, bool value)
{
    Control c = element as Control;
    if (c != null && value)
    {
        RoutedEventHandler loadedEventHandler = null;
        loadedEventHandler = new RoutedEventHandler(delegate
        {
            // This could also be added in the Loaded event of the MainPage
            HtmlPage.Plugin.Focus();
            c.Loaded -= loadedEventHandler;
            c.Focus();
        });
        c.Loaded += loadedEventHandler;
    }
}

(В некоторых случаях вам может потребоваться также вызвать ApplyTemplate в соответствии с этой ссылкой )

...