簡體   English   中英

為什么 FrameworkElement.FindName(string) 方法在我的情況下返回 null?

[英]Why the FrameworkElement.FindName(string) method returns null in my case?

WPF、.NET 4.6.1

為什么FrameworkElement.FindName(string)方法在我的情況下返回null

class Sandbox {

    const string listBoxName = "lb";

    [STAThread]
    static void Main(string[] args) {

        Window win = new Window();

        ListBox lb = new ListBox();
        lb.Name = listBoxName;

        win.Content = lb;
        win.IsVisibleChanged += Win_IsVisibleChanged;

        Application app = new Application();
        app.Run(win);
    }

    private static void Win_IsVisibleChanged(Object sender,
        DependencyPropertyChangedEventArgs e) {

        if ((bool)e.NewValue) {

            Window win = sender as Window;
            var lb = win.FindName(listBoxName); // null
            // ...
        }
    }
}

MSDN

如果元素有子元素,則遞歸搜索這些子元素以查找所請求的命名元素。

我的lbwin對象的子元素,但是win.FindName(listBoxName)找不到它...

您可以在 MSDN 文檔中看到您鏈接的內容:

FindName 在當前元素的名稱范圍內運行。

其中名稱范圍是 XAML 名稱范圍。 這些范圍是在從 XAML 構建控制樹時創建的。 當您自己構建樹時,根本不涉及 XAML(就像您的情況一樣)-默認情況下不會創建此類范圍。 這意味着在 XAML 范圍內沒有注冊任何控件,因為根本沒有這樣的范圍。 您可以在此處閱讀有關 XAML 范圍的更多信息。

但是,如果您願意,您可以自己創建范圍並注冊您的姓名:

class Program {
    const string listBoxName = "lb";

    [STAThread]
    static void Main(string[] args) {

        Window win = new Window();
        // create scope and associate it with Window
        NameScope.SetNameScope(win, new NameScope());
        ListBox lb = new ListBox();
        lb.Name = listBoxName;
        // register "lb" name
        win.RegisterName(listBoxName, lb);

        win.Content = lb;
        win.IsVisibleChanged += Win_IsVisibleChanged;

        Application app = new Application();
        app.Run(win);
    }

    private static void Win_IsVisibleChanged(Object sender,
        DependencyPropertyChangedEventArgs e) {

        if ((bool) e.NewValue) {

            Window win = sender as Window;
            var lb = win.FindName(listBoxName); // null
            Console.WriteLine(lb);
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM