我有一个方法可以禁用窗口上的所有butttons。 但我似乎无法获得Button类型以匹配资源集合
我正在使用带有c#代码隐藏的Expression Blend 3
void DisableButtons()
{
for(int i = 0; i>= this.Resources.Count -1; i ++)
{
if (this.Resources[i].GetType() == typeof(Button))
{
Button btn = (Button)this.Resources[i];
btn.IsEnabled = false;
}
}
}
更新
感谢您的回答!
确定循环正在运行,但我的代码不正确。
this.Resources
好像不包括我的按钮!这可能是 Blend 的事情吗?
所以是的。 我最终手动完成了。因为我很仓促,并没有一个简单的简单解决方案。感谢所有的输入!
答案 0 :(得分:5)
void DisableButtons()
{
for(int i = 0; i < Resources.Count; i ++)
{
var btn = Resources[i] as Button;
if(btn != null)
{
btn.IsEnabled = false;
}
}
}
实现它的简单方法是使用带有LINQ查询的foreach指令,但这种方式需要更多的资源。
void DisableButtons()
{
foreach(var button in Resources.OfType<Button>())
{
button.IsEnabled = false;
}
}
答案 1 :(得分:2)
我可能会误解某些内容,但您正试图在窗口的资源中找到窗口中的按钮?因为这两件事情完全不同。
如果是这种情况,请尝试设置this.IsEnabled = false(但禁用其他内容,而不仅仅是按钮),或者使用LogicalTreeHelper / VisualTreeHelper遍历逻辑树(或者如果是silverlight的可视树),尽管这是一种非常昂贵的方法。
手动解决方法是为所有按钮指定名称,在代码隐藏中列出它们并迭代该列表。
然而最好的方法是在ViewModel中创建一个名为AreButtonsEnabled的布尔属性(如果你不使用MVVM而不是简单地在控件本身上 - 但是使它成为DependencyProperty)并绑定所有按钮的IsEnabled属性给他们!然后在codebehind中简单地将布尔值设置为false ......然后魔术就会出现。
如果这不是你的情况,那么抱歉我浪费了你的时间。
答案 2 :(得分:1)
这是怎么回事?
if (this.Resources[i].GetType() == typeof(Button)))
甚至更好
if (this.Resources[i] is Button))
答案 3 :(得分:1)
看起来你的循环语句是错误的。 i>= this.Resources.Count -1
应为i <= this.Resources.Count - 1;
它永远不会进入你的循环。
此外,这只是一种风格,但我将其重写为:
for(int i = 0; i < Resources.Count; i ++)
{
Button btn = Resources[i] as Button; // btn will be null if not a Button
if( btn != null )
{
btn.IsEnabled = false;
}
}
答案 4 :(得分:1)
怎么样?
if (this.Resources[i] is Button)
这样你就可以得到任何继承自Button的东西。
答案 5 :(得分:1)
我使用一种简单的方法。 首先,你创建一个布尔。
bool enableButtons = true;
现在我在表格中添加一个计时器,它始终处于活动状态。
private void timer1_Tick(object sender, EventArgs e)
{
if (enableButtons = false)
{
button1.Enabled = false;
button2.Enabled = false;
}
else
{
button1.Enabled = true;
button2.Enabled = true;
}
}
因此,每当我想要禁用按钮时,我只需将enableButtons
更改为false。