2013-02-12 42 views
1

我有一個用戶控件,包含一個網格,包含一個子控件。什麼是更智能的方式來獲得XAML中的子控件?

我想從用戶控件背後的代碼中獲得對子控件的引用。

這是我有:

var childControl = (MyChildControlType)this.Grid.Children.Single(c => (string) c.GetValue(NameProperty) == "MyChildControlNameFromXAMLNameAttribute"); 

醜陋不堪,在垃圾桶的蓋子運行。

什麼是更好的方法來做到這一點?

+0

你想要什麼元素?不應該在後面的代碼中操作XAML元素。 – 2013-02-12 04:17:33

+0

給孩子一個x:姓名屬性 – awright18 2013-02-12 04:20:40

回答

2

指定名稱或X:名稱在XAML元素(除非它是一個模板內),使從後臺代碼訪問該元素作爲具有該名稱的字段。因此,這基本上已經宣告和的InitializeComponent過程中爲您填充:

MyChildControlType MyChildControlNameFromXAMLNameAttribute; 

,你可以直接使用它:

MyChildControlNameFromXAMLNameAttribute.Visibility = Visibility.Hidden; 
+0

哦......呃。謝謝。 – 2013-02-13 23:50:25

+0

如果您在代碼隱藏,查找模板等方面不夠正確,其他內容仍然派上用場,只是在這裏不需要。 :) – 2013-02-14 04:02:20

+1

解釋如何在後面的代碼中奇蹟般地彈出這些字段:http://msdn.microsoft.com/en-us/library/cc189028(v=vs.95).aspx – 2013-02-15 05:18:25

1

可能是這樣,給X:命名您childControl

var childControl = (MyChildControlType)MyGridNameFromXAMLNameAttribute.FindName("MyChildControlNameFromXAMLNameAttribute"); 
5

你既可以使用名稱獵走,沿着什麼一直線已經建議:

var childControl = (MyChildControlType)this.Grid.FindName("MyChildControlNameEtc"); 

或者,如果你想要一個更通用的方法是什麼您已經嘗試(例如,如果你想用不同的屬性來查找),你可以嘗試:

var childControl = (MyChildControlType)this.Grid.Children.OfType<FrameworkElement>().Single(f => f.Name == "Blah"); 

var childControl = (MyChildControlType)this.Grid.Children.OfType<MyChildControlType>().Single(f => f.Name == "Blah"); 

或者你可以使用VisualTreeHelper,這將與非網格工作,如果你需要遞歸向下的可視化樹會特別很好地工作:

for(int i = 0; i < VisualTreeHelper.GetChildrenCount(this.Grid); ++i) 
{ 
    var child = VisualTreeHelper.GetChild(this.Grid, i) as FrameworkElement; 
    if (child != null && child.Name == "Blah") 
     return child; 
} 

但是真的如果你只需要命名它並從代碼隱藏中訪問它,就像John Bowen說的那樣,這是迄今爲止最簡單的。 「作爲垃圾桶蓋上的垃圾,醜陋」

相關問題