2010-11-12 53 views

回答

26

您可以使用VisualTreeHelper靜態類爬行控制樹。 這是它如何在C#來完成(對不起,我VB誦讀困難))

T FindFirstChild<T>(FrameworkElement element) where T: FrameworkElement 
    { 
     int childrenCount = VisualTreeHelper.GetChildrenCount(element); 
     var children = new FrameworkElement[childrenCount]; 

     for (int i = 0; i < childrenCount; i++) 
     { 
      var child = VisualTreeHelper.GetChild(element, i) as FrameworkElement; 
      children[i] = child; 
      if (child is T) 
       return (T)child; 
     } 

     for (int i = 0; i < childrenCount; i++) 
      if (children[i] != null) 
      { 
       var subChild = FindFirstChild<T>(children[i]); 
       if (subChild != null) 
        return subChild; 
      } 

     return null; 
    } 
+3

這適用於大多數框架元素,但不適用於ContentPresenter – 2012-03-03 02:18:35

+2

@John:聽起來很奇怪。那麼究竟是什麼問題呢?您無法在樹中找到ContentPresenter,或找不到ContentPresenter的子項?難道當你在搜索視覺樹時還沒有構造出來? – 2012-03-05 11:50:08

+2

@ Alpha-mouse:你懂了!我將一個元素添加到列表中,然後立即嘗試將其中一個控件集中。使用調度程序將焦點操作安排到後臺優先級解決了我的問題。 – 2012-03-07 04:54:27

3
Dim myContentPresenter = CType(obj, ContentPresenter) 
Dim myDataTemplate = myContentPresenter.ContentTemplate 
Dim target = CType(myDataTemplate.FindName("txtQuantity", myContentPresenter), TextBox) 
3

ContentPresenter具有唯一的孩子。你得到孩子只需

VisualTreeHelper.GetChild(yourContentPresenterObj, 0); 

如果你需要更進一步 - 到第一發現TextBox,那麼,是的,您使用@阿爾法鼠標建議的更全面的方法。