C#WPF是迭代子级并更改属性的更好方法

C#WPF是迭代子级并更改属性的更好方法,c#,wpf,loops,properties,casting,C#,Wpf,Loops,Properties,Casting,我必须遍历stackPanel的所有子级。 作为WPF的新手,我会这么做 foreach (var item in spTab3.Children) { if (item.GetType() == typeof(ListBox)) ((ListBox)item).Visibility = Visibility.Collapsed; if (item.GetType() == typeof(Grid)) ((Grid)item).Visibility

我必须遍历stackPanel的所有子级。 作为WPF的新手,我会这么做

foreach (var item in spTab3.Children)
  {
    if (item.GetType() == typeof(ListBox))
      ((ListBox)item).Visibility = Visibility.Collapsed;
     if (item.GetType() == typeof(Grid))
      ((Grid)item).Visibility = Visibility.Collapsed;
    ....
  }
也就是说,我必须转换所有类型的元素来设置可见性。我打赌有一个更聪明的方法来做所有的事情。 谢谢

---编辑--- 总之,我有一个带孩子的stackpanel spTab3。 当我按照Bijington的建议做时:

spTab3.Visibility = Visibility.Collapsed;<----------set all children to collapsed
spTab3.Children[iVisibleTab-1].Visibility = Visibility.Visible;<----set only one to visible

谁能解释一下为什么

StackPanel
中显示/隐藏
子项的更有效方法是在
StackPanel
本身上设置
Visibility
属性。

面板中的每个子项都是UIElement。所以它的类型派生自DependencyObject,该对象具有SetValue方法。使用它

foreach (UIElement item in spTab3.Children)
{
    item.SetValue(UIElement.VisibilityProperty, Visibility.Collapsed (or Visible));
}
请记住,它不是WPF风格的解决方案。您最好声明依赖项属性,并将项的可见性绑定到此属性

如果面板和代码位于窗口内

public static readonly DependencyProperty IsItemVisibleProperty = DependencyProperty.Register("IsItemVisible", typeof(Visibility), typeof(MainWindow), new FrameworkPropertyMetadata(Visibility.Visible));

public Visibility IsItemVisible
{
    get
    {
        return (Visibility)GetValue(IsItemVisibleProperty);
    }
    set
    {
        SetValue(IsItemVisibleProperty, value);
    }
}
XAML:


崩溃1
崩溃2
看得见的

为什么要将所有可见性设置为“已折叠”
?因为首先我将所有可见性设置为“已折叠”,然后我将它们设置为仅显示我感兴趣的可见性。可见性属性继承自UIElement,因此您需要仅强制转换为UIElement。@Spawn thanx很多!!foreach(spTab3.Children中的UIElement项)item.Visibility=Visibility.Collapsed;作品你可能想把它作为一个解决方案,这样我就可以投票给你。你需要迭代所有的孩子并改变他们的可视性吗?你不能仅仅改变StackPanel本身的可见性吗?对不起,我没有选中它,这是一个解决方案。原因在我的编辑中。谢谢你,这是正确的,但是Spawn以前说过。我会再等一段时间等他的答案,然后再把你的答案标记为正确。
public static readonly DependencyProperty IsItemVisibleProperty = DependencyProperty.Register("IsItemVisible", typeof(Visibility), typeof(MainWindow), new FrameworkPropertyMetadata(Visibility.Visible));

public Visibility IsItemVisible
{
    get
    {
        return (Visibility)GetValue(IsItemVisibleProperty);
    }
    set
    {
        SetValue(IsItemVisibleProperty, value);
    }
}
<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <StackPanel>
        <Button Visibility="{Binding IsItemVisible,RelativeSource={RelativeSource AncestorType=Window}}">Collapsed 1</Button>
        <Button Visibility="{Binding IsItemVisible,RelativeSource={RelativeSource AncestorType=Window}}">Collapsed 2</Button>
        <Button>Visible</Button>
    </StackPanel>
</Window>