我还处于学习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语句中的部分是完全错误的,但我不知道如何继续这一点。任何人都可以向我推进正确的方向吗? 感谢名单!
答案 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。