【问题标题】:C# WPF better way to iterate on children and change propertyC# WPF 更好的方法来迭代子级和更改属性
【发布时间】:2015-11-30 09:29:19
【问题描述】:

我必须遍历 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

第二行没有效果。 当我按照 Spawn 的说明进行操作时:

foreach (var item in spTab3.Children)
    ((UIElement)item).Visibility = Visibility.Collapsed;

 spTab3.Children[iVisibleTab-1].Visibility = Visibility.Visible;

谁能解释一下为什么?!?

【问题讨论】:

  • 为什么要将所有可见性设置为Collapsed
  • 因为首先我将它们全部设置为折叠,然后我将其设置为仅我感兴趣的可见。
  • Visibility 属性继承自 UIElement,因此您只需转换为 UIElement。
  • @Spawn 非常感谢!! foreach (spTab3.Children 中的 UIElement 项) item.Visibility = Visibility.Collapsed;作品。您可能想提出它作为解决方案,以便我可以投票给您
  • 您是否必须遍历所有孩子并更改他们的可见性?你不能只改变 StackPanel 本身的可见性吗?

标签: c# wpf loops properties casting


【解决方案1】:

Panel 中的每个子元素都是 UIElement。所以它的类型派生自具有 SetValue 方法的 DependencyObject。使用它。

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:

<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>

【讨论】:

  • 谢谢你说得对,但 Spawn 之前说过。在将您的答案标记为正确之前,我会再等一段时间等待他的回答。
【解决方案2】:

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

【讨论】:

  • 对不起,我取消选中它是一个解决方案。原因在我的编辑中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-17
相关资源
最近更新 更多