2014-01-22 46 views
2

我正在檢查ComboBox控件模板(http://msdn.microsoft.com/en-us/library/ms752094(v=vs.110).aspx),他們使用切換按鈕切換彈出窗口。有沒有辦法從後面的代碼中獲取切換按鈕?如何從ComboBox控件獲取ToggleButton

我試過這個,但沒有成功:-(

var uiElement = (ComboBox)sender; 
var toggleButton = uiElement.FindResource(typeof(ToggleButton)) as ToggleButton; 
+0

這將幫助你: [WPF的方式找到控制(http://stackoverflow.com/questions/636383/wpf-ways-to-find-controls) –

+0

這可能需要一個性能命中我遍歷Visual Tree,還有其他建議嗎? –

+0

你必須遍歷VisualTree來獲取孩子。爲什麼這會成爲業績衝擊? –

回答

1

如果現在切換按鈕的名稱,那麼你可以使用下面的代碼:如果你不

var uiElement = (ComboBox)sender; 
var toggleButton = uiElement.Template.FindName("<Your ToggleButton Name Here>",uiElement) as ToggleButton; 

if(toggleButton!=null) 
{ 
    // Your code goes here. 
} 

知道ToggleButton的名稱,那麼在這種情況下,唯一的選擇是遍歷視覺樹並找到類型切換按鈕的元素。示例代碼如下:

internal static List<T> FindVisualChild<T>(this DependencyObject depObj) where T : DependencyObject 
    { 
     if (depObj != null) 
     { 
      List<T> childItems = null; 
      for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++) 
      { 

       if (childItems == null) 
        childItems = new List<T>(); 

       DependencyObject child = VisualTreeHelper.GetChild(depObj, i); 
       if (child != null && child is T) 
       { 
        childItems.Add((T)child); 
       } 

       var recursiveChildItems = FindVisualChild<T>(child); 
       if (recursiveChildItems != null && recursiveChildItems.Count > 0) 
        childItems.AddRange(recursiveChildItems); 
      } 
      return childItems; 
     } 
     return null; 
    } 

上述方法是對DependencyObject的擴展,並將從可視化樹中返回指定類型的所有元素。如果只需要指定類型的第一個元素,則可以對該方法進行輕微更改,並在獲取指定類型的第一個元素並返回時打破循環。

+0

對於正確和擴展的答案+1。 你給了一個正確的答案,但主題首發不感激它(( –

+0

我也需要這個,嘗試組合框的FindVisualChild方法,但沒有返回任何togglebutton :( – WtFudgE

0

這件事讓我回答。

var uiElement = (ComboBox)sender; 
var toggleButton = uiElement.FindName("ToggleButton") as ToggleButton; 
相關問題