问题描述
|
如何从窗口获取所有按钮? (将IsEnabled属性设置为false)
解决方法
您可以遍历所有控件。例如:
foreach (var ctrl in LayoutRoot.Children)
{
if (ctrl is Button)
((Button)ctrl).IsEnabled = false;
}
当然,“ 1”是默认名称。您可以根据需要将其更改为另一个容器。
编辑以允许嵌套面板的递归(在注释中提到)。
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);
}
}
}
}
}
, 好吧,DisableAllButtons()有时可能会起作用,但是总的来说是不够的。这是一个真实的例子。 (经过一些简化。)
列表框
滚动查看器
边境
格网
ScrollContentPresenter
项目演示者
虚拟化堆栈面板
ListBoxItem
ContentPresenter
格网
文字区块
文字区块
纽扣
ListBoxItem
ContentPresenter
格网
文字区块
文字区块
文字区块
滚动条
格网
格网
重复按钮
拇指
长方形
重复按钮
如果您想要一个可靠的解决方案,则代替枚举Panel子级使用
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) );
}
}