我怎么能以更聪明的方式做到这一点? (要设置状态的图像列表)

时间:2012-01-13 19:16:47

标签: c# list

我还处于学习c#的初级阶段,所以我对我的部分代码有疑问。 我强烈认为应该有一种更聪明的方式来实现我的目标:

那我该怎么办: 一个WPF窗口,上面有一大堆图像。 在开始时,我希望将它们全部设置为隐藏,因此在窗口的初始化部分,我将它们全部隐藏起来并按照以下方式执行:

.....
IMx01y01W.Visibility = Visibility.Hidden; 
IMx23y73W.Visibility = Visibility.Hidden;
IMx31y21W.Visibility = Visibility.Hidden;
IMx03y16W.Visibility = Visibility.Hidden;
.....

IMx ## y ## W等图像名称中有逻辑,其中##是变量编号。

如上所述,我强烈认为应该有一些更聪明的方法来做到这一点。

=======

编辑1

好的,到目前为止,我最终得到了这个:

    foreach (object obj in LogicalTreeHelper.GetChildren(this))
    {
        if (obj is Image)
        {
        Image obj = (Image)item;
        obj.Visibility = Visibility.Hidden;
        }

    //do something
    }

if语句中的部分是完全错误的,但我不知道如何继续这一点。任何人都可以向我推进正确的方向吗? 感谢名单!

3 个答案:

答案 0 :(得分:2)

您可以将此要求设置为“将各种图像的Visibility属性设置为相同的值”,即它们都基于相同的标记显示/隐藏。 WPF有一些机制需要与传统的命令式代码略有不同的思维方式,但可以大大简化这种情况。

WPF支持databinding的概念,它允许您声明图像对值的依赖性,而不是手动应用值。您可以利用此功能仅在标记中管理Visibility属性值。

要学习的主要内容是DataContext property,它表示当前绑定到特定控件的对象。在这种情况下,您可以将数据上下文设置为值Visibility

public MainWindow()
{
    DataContext = Visibility.Hidden;
}

一旦你这样做,它就会在整个对象树中级联,所以MainWindow的所有孩子都会继承这个相同的值。这意味着您可以在XAML中执行此操作:

<Image x:Name="IMx01y01W" Visibility="{Binding}" />
<Image x:Name="IMx23y73W" Visibility="{Binding}" />

告诉WPF您希望Visibility属性反映当前DataContext的值,这将是您在构造函数中设置的Visibility.Hidden值。

关于这一点的好处是,如果你改变DataContext属性的值,它将自动反映在你的所有图像中而不需要任何额外的工作:

private void MakeImagesVisible()
{
    DataContext = Visibility.Visible;

    // At this point, all images will be visible
}

关键的一点是,WPF以与Windows Forms等传统UI范例不同的方式处理事情。学习这些新技术背后的理念,而不是复制传统技术,将有助于使WPF更容易理解并符合您的意愿。

答案 1 :(得分:1)

是的。您可以获取容器控件的所有子项并过滤特定类型,您的案例中的图像,并对这些实例执行操作。见this forum post for a sample。并且this SO post。并this one

编辑1:

foreach (object obj in LogicalTreeHelper.GetChildren(this))
{
    if (obj is Image)
    {
    Image img = (Image)obj;
    img.Visibility = Visibility.Hidden;
    }
}

答案 2 :(得分:0)

你可以做的一件事是

IMx01y01W.Visibility = IMx23y73W.Visibility = ... = Visibility.Hidden;

但我不会把它称为可读性。

你可以做的是创建一个IMx01y01W对象(它们的基类)的集合,并遍历该集合设置Visibility to Hidden。