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

本文关键字:设置 状态 列表 图像 这一点 怎么能 更聪明 方法 | 更新日期: 2023-09-27 18:20:11

我还处于学习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语句中的部分是完全错误的,但我不知道如何在这一点上继续下去。有人能把我推向正确的方向吗?thanx!

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

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

WPF支持数据绑定的概念,它允许您声明图像对某个值的依赖性,而不是手动应用该值。您可以利用这一点仅在标记中管理Visibility属性值。

要了解的主要内容是DataContext属性,它表示当前绑定到特定控件的对象。在这种情况下,您可以将数据上下文设置为值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以不同于传统UI范式(如Windows窗体)的方式做事。学习这些新技术背后的哲学,而不是复制传统技术,将有助于使WPF更容易理解并服从您的意愿。

是的。您可以获取容器控件的所有子级,并针对特定类型进行筛选,在您的案例中获取图像,并对这些实例执行操作。请参阅此论坛文章以获取示例。还有这个SO帖子。还有这个。

第1版:

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

您可以做的一件事是

IMx01y01W。可见性=IMx23y73W。可见性=…=可见性。隐藏;

但我不认为这更可读。

相反,您可以创建一个IMx01y01W对象(其基类)的集合,并迭代该集合设置Visibility to Hidden。