我正在尝试在Windows Phone中开发游戏。我是初学者,使用c#和xaml。在xaml中我具有相同属性的对象只有Tag属性不同。我想要做的是循环througth对象标签,如果我找到一个特定的标签,改变另一个对象(图像)。
我尝试了一些代码,如下:
foreach(Image tag in img) //but it says:
foreach语句无法对“Windows.Ui.Xaml.Controls.Image”类型的变量进行操作,因为“Windows.Ui.Xaml.Controls.Image”不包含“GetEnumerator”的公共定义...
答案 0 :(得分:2)
由于作为初学者,您不太可能使用MVVM并将所有内容保留在View中,您可以做的只是在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调整解决这个问题。另外,将ViewModel分离为自定义控件会使它更难以将它复制到另一个项目中,如果你把它放在你自己的项目中 - 你必须找到viewmodel!:))。
答案 1 :(得分:1)
就像其他人所说的那样,你需要一个集合来循环 就个人而言,我喜欢词典 以下是我认为您可以根据自己的目的进行修改的示例。
这将使您能够循环使用对象标记"但是,正如HighCore所提到的那样,它可能不是#34;正确的方式"做任何你最终想要完成的事情。
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...
}