[英]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 :
如果元素有子元素,則遞歸搜索這些子元素以查找所請求的命名元素。
我的lb
是win
對象的子元素,但是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.