2014-01-22 43 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; 
相关问题