检查Silverlight中是否加载了控件

时间:2011-05-17 09:11:00

标签: silverlight silverlight-4.0 extension-methods

我正在尝试编写一个扩展方法,允许我将注意力设置在Control上。我已经编写了下面的方法,该方法工作正常,但是如果控件已经加载,那么显然挂起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 个答案:

答案 0 :(得分:2)

如果尚未加载控件,则不会构建其模板中的各种元素。使用Linq-to-VisualTree即可确认:

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

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

第一个调试输出应显示“0”,第二个将是一个数字> 0,表示模板应用后控件的子元素数。

答案 1 :(得分:2)

或者足以检查父母:

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

如果父级为null,则不加载控件(因为它在可视树中没有父级)