2011-05-31 40 views

回答

2

您可以遍历所有控件。例如:

foreach (var ctrl in LayoutRoot.Children) 
{ 
     if (ctrl is Button) 
     ((Button)ctrl).IsEnabled = false; 
} 

当然,LayoutRoot是默认的名称。如果需要,您可以将其更改为另一个容器。

编辑为允许递归嵌套面板(在评论中提到)。

private void DisableAllButtons(Panel parent) 
{ 

    foreach (var ctrl in parent.Children) 
    { 

     if (ctrl is Button) 
     { 

      ((Button)(ctrl)).IsEnabled = false; 

     } 
     else 
     { 
      if (ctrl is Panel) 
      { 
        if (((Panel)ctrl).Children.Count > 0) 
        { 

         DisableAllButtons((Panel)ctrl); 

        } 
       } 

     } 

    } 

    } 
+0

这不需要递归地完成?例如,如果'LayoutRoot'包含另一个包含'Button'的Panel。 – Praetorian 2011-05-31 23:12:05

+0

@Praetorian:我假定用户只是指一个容器,但是你是对的,如果该容器包含另一个容器,那么它将需要递归地完成。 @Tony - 你有嵌套的容器吗? – keyboardP 2011-05-31 23:15:46

+0

编辑答案只是有嵌套面板。 – keyboardP 2011-05-31 23:23:22

1

那么,DisableAllButtons()有时可能会工作,但通常是不够的。这是一个真实世界的例子。 (经过一些简化。)

 
ListBox 
    ScrollViewer 
    Border 
     Grid 
     ScrollContentPresenter 
      ItemsPresenter 
      VirtualizingStackPanel 
       ListBoxItem 
       ContentPresenter 
        Grid 
        TextBlock 
        TextBlock 
        Button 
       ListBoxItem 
       ContentPresenter 
        Grid 
        TextBlock 
        TextBlock 
        TextBlock 
     ScrollBar 
      Grid 
      Grid 
       RepeatButton 
       Thumb 
       Rectangle 
       RepeatButton 

如果你想要一个可靠的解决方案,然后代替枚举面板小孩使用 VisualTreeHelper类及其方法GetCildrenCount()和GetChild()。这是代码:

void DisableAllButtons(FrameworkElement fe) 
{ 
    if (fe is Button) 
     ((Button)(fe)).IsEnabled = false; 

    int count = VisualTreeHelper.GetChildrenCount(fe); 
    for (int index = 0; index < count; ++index) 
    { 
     DisableAllButtons((FrameworkElement)VisualTreeHelper.GetChild(fe, index)); 
    } 
}