2014-09-12 91 views
0

我试图在Windows Phone中开发游戏。我是一个使用c#和xaml的初学者。在xaml中,我只有Tag属性的对象具有相同的属性。我想要做的是循环通过对象标签,并改变另一个对象(图像),如果我找到一个特定的标签。在Windows Phone中循环访问对象以获取其属性

我已经尝试了一些代码,就像这样:

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

foreach语句不能对类型的变量 'Windows.Ui.Xaml.Controls.Image',因为“Windows.Ui.Xaml操作。 “Controls.Image”不包含'GetEnumerator'的公共定义...

+5

'图像'不是一个集合,所以这是有道理的。老实说,整个用例听起来很奇怪。你能否充实你想要完成的事情,这样我们可以提出一个更好的方法? – BradleyDotNET 2014-09-12 18:36:33

+0

错误信息告诉你到底发生了什么错误。如果你不熟悉'GetEnumerator',那么就直接google吧 – MethodMan 2014-09-12 18:39:26

回答

2

因为作为一个初学者,你不太可能使用MVVM,只是在查看放下一切,你可以做的就是通过LayoutRoot周期。如果您有包含图像的layoutroot其他面板,你想递归做到这一点:

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

像其他人一样,你需要一个集合来循环播放。
我个人喜欢字典。
下面是一个例子,我认为你可以根据自己的目的进行修改。

这将使您能够“循环使用对象标签”,但是如提到的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... 
     } 
+0

这是个不好的建议。您不会在基于XAML的技术中“使用”字典。相反,您使用适当的XAML来定义UI和DataBinding以与之交互。 – 2014-09-12 20:33:02

+0

@HighCore第一:我同意你的看法。第二:这个问题不是关于DataBinding,他只是说'我想要做的是循环通过对象标签'。最后,OP声明他是一名初学者,这意味着他可能不会关注[MVVM](http://msdn.microsoft.com/en-us/magazine/dd419663.aspx)。 – 2014-09-12 20:47:33