Проверьте, загружен ли элемент управления в Silverlight - PullRequest
1 голос
/ 17 мая 2011

Я пытаюсь написать метод расширения, который позволит мне сфокусироваться на элементе управления. Я написал метод ниже, который работает нормально, однако, если элемент управления уже загружен, то, очевидно, подключение события Loaded не будет никакого смысла - мне также нужен способ проверить, был ли элемент управления загружен, так что Я могу просто запустить код Focus(), не подключая событие.

Можно ли имитировать свойство IsLoaded в элементе управления?

public static void SetFocus(this Control control)
{
    // return if the control is not visible
    if (control.Visibility == Visibility.Collapsed) { return; }

    control.Loaded += (sender, routedeventArgs) =>
        {
            // focus the Silverlight plugin first
            System.Windows.Browser.HtmlPage.Plugin.Focus();

            control.IsTabStop = true; // required to allow Focus
            control.Focus();

            if (control is TextBox)
            {
                ((TextBox)control).SelectAll();
            }
        };
}

РЕДАКТИРОВАТЬ: В соответствии с ответом ColinE ниже, я реализовал это так:

public static void SetFocus(this Control control)
{
    // return if the control is not visible
    if (control.Visibility == Visibility.Collapsed) { return; }

    if (control.Descendants().Count() > 0)
    {
        // already loaded, just set focus and return
        SetFocusDelegate(control);
        return;
    }

    // not loaded, wait for load before setting focus
    control.Loaded += (sender, routedeventArgs) =>
    {
        SetFocusDelegate(control);
    };
}

public static void SetFocusDelegate(Control control)
{
    // focus the Silverlight plugin first
    System.Windows.Browser.HtmlPage.Plugin.Focus();

    control.IsTabStop = true; // required to allow Focus
    control.Focus();

    if (control is TextBox)
    {
        ((TextBox)control).SelectAll();
    }
}

Ответы [ 2 ]

2 голосов
/ 06 сентября 2012

или достаточно проверить родительский элемент:

var parent = System.Windows.Media.VisualTreeHelper.GetParent(control);

, если родительский элемент равен нулю, тогда элемент управления не загружается (поскольку у него нет родительского элемента в визуальном дереве)

2 голосов
/ 17 мая 2011

Если элемент управления не был загружен, то различные элементы в его шаблоне не будут созданы.Используя Linq-to-VisualTree , вы можете подтвердить это:

Debug.WriteLine(control.Descendants().Count());

control.Loaded += (s, e) =>
  {
    Debug.WriteLine(foo.Descendants().Count());
  };

Первый вывод отладки должен показывать '0', второй будет числом> 0, которое указывает число потомковэлементы управления после применения шаблона.

...