循环浏览对象以在Windows Phone中获取其属性

本文关键字:获取 属性 Phone Windows 浏览 对象 循环 | 更新日期: 2023-09-27 18:21:38

我正试图在Windows Phone中开发一款游戏。我是一个使用c#和xaml的初学者。在xaml中,我有具有相同属性的对象,只有Tag属性不同。我想做的是循环遍历对象标记,如果我找到一个特定的标记,就为另一个对象(图像)进行更改。

我试过一些代码,比如:

foreach(Image tag in img) //but it says: 

foreach语句无法对"Windows.Ui.Xaml.Controls.Image"类型的变量进行操作,因为"Windows.Ui.Xaml.Cntrols.Image"不包含"GetEnumerator"的公共定义。。。

循环浏览对象以在Windows Phone中获取其属性

作为一个初学者,您不太可能使用MVVM并将所有内容都保留在视图中,因此您只需在LayoutRoot中循环即可。如果您在layoutroot中有其他包含图像的Panel,您希望递归地执行:

MainPage()
{
    DoSomethingToImages(LayoutRoot);
}
DoSomethingToImages(Panel panel)
{
    foreach(Image img in panel.Children.Where(x=> x is Image))
    {
        DoSomething(img);
    }
    var panels = panel.Children.Where(x=> x is Panel);
    if (panels.Count > 0)
    {
        foreach(Panel p in panels)
        {
            DoSomethingToImages(p);
        }
    }
}

另一方面,这显然是一种糟糕的做法,通常会将图像绑定到视图模型。唯一的例外可能是大量定制的用户控件,以使事情正常工作,否则使用MVVM会非常耗时。(注意:我认为MVVM对于自定义控件来说并不总是必要的,因为很多时候你只需要一些自定义的图形行为,比如一个按钮,它的按下状态也有图像背景,而这些东西属于视图,但你通常可以通过在视图中的依赖属性和一些XAML调整来解决这个问题如果你把它放在自己的项目中,复制到另一个项目会有点困难吗?你还必须找到视图模型!:))。

正如其他人所说,您需要一个集合来循环
就我个人而言,我喜欢字典
下面是一个示例,我认为您可以出于自己的目的进行修改。

这将使您能够"循环通过对象标记",然而,正如HighCore所提到的,这可能不是"正确的方式"来完成您最终想要完成的任务。

        Image img1 = new Image();
        Image img2 = new Image();
        Image img3 = new Image();
        img1.Tag = "tag1";
        img2.Tag = "tag2";
        img3.Tag = "tag3";
        Dictionary<string, Image> ImgDictionary = new Dictionary<string, Image>();
        ImgDictionary.Add(img1.Tag.ToString(), img1);
        ImgDictionary.Add(img2.Tag.ToString(), img2);
        ImgDictionary.Add(img3.Tag.ToString(), img3);
        foreach (KeyValuePair<string, Image> i in ImgDictionary)
        {
            // do stuff with i.Value or i.Key 
        }
        string tmp_TagName = "tag1";
        if (ImgDictionary.ContainsKey(tmp_TagName))
        {
            Image ReturnImage;
            ImgDictionary.TryGetValue(tmp_TagName, out ReturnImage);
            // do something with your ReturnImage...
        }