我创建了一个包含多个控件的页面,在此我必须获取页面中的图像。我将图像名称作为字符串值。我已经创建了一个for循环来查找图像并返回,但是如果页面中的所有控件都更多并且它也会花费很多时间,那么它是很乏味的。
//传递字符串并查找为图像
Image imgBack = FindControl<Image>((UIElement)Layout, typeof(Image), strSelectedimg);
//查找图像的功能
public T FindControl<T>(UIElement parent, Type targetType, string ControlName) where T : FrameworkElement
{
if (parent == null) return null;
if (parent.GetType() == targetType && ((T)parent).Name == ControlName)
{
return (T)parent;
}
T result = null;
int count = VisualTreeHelper.GetChildrenCount(parent);
for (int i = 0; i < count; i++)
{
UIElement child = (UIElement)VisualTreeHelper.GetChild(parent, i);
if (FindControl<T>(child, targetType, ControlName) != null)
{
result = FindControl<T>(child, targetType, ControlName);
break;
}
}
return result;
}
是否还有其他简单的方法可以使用字符串值在页面中查找图像。?
答案 0 :(得分:0)
也许您可以在添加图像的同时构建查找。如果你发布在运行时添加图像的代码,我可以给你一个更准确的答案;但我在想这样的事情:
private Dictionary<string, Image> _imageLookup;
private class ImageInfo
{
public string Name { get; set; }
public string Uri { get; set; }
}
private void AddImages(ImageInfo[] imageInfos)
{
this._imageLookup = new Dictionary<string, Image>();
foreach (var info in imageInfos)
{
var img = CreateImage(info.Name, info.Uri);
if (!this._imageLookup.ContainsKey(info.Name))
{
this._imageLookup.Add(info.Name, img);
}
AddImageToUI(img);
}
}
private Image CreateImage(string name, string uri)
{
// TODO: Implement
throw new NotImplementedException();
}
private void AddImageToUI(Image img)
{
// TODO: Implement
throw new NotImplementedException();
}
然后您可以在以后轻松找到该图像:
public Image FindControl(string strSelectedImg)
{
if (this._imageLookup.ContainsKey(strSelectedImg))
{
return this._imageLookup[strSelectedImg];
}
else
{
return null; // Or maybe throw exception
}
}
如果您需要查找的不仅仅是图片,可以改用Dictionary<string, Control>
或Dictionary<string, UIElement>
。
答案 1 :(得分:0)
如果您使用Silverlight Toolkit,那么您不需要自己维护这个帮助方法,因为它已经作为扩展方法提供了类似的方法。
using System.Linq;
using System.Windows.Controls.Primitives;
// ...
private void DoStuff()
{
var myImage = this.MyRootLayoutPanel.GetVisualDescendants().OfType<Image>()
.Where(img => img.Name == "MyImageName").FirstOrDefault();
}
或者,我不知道您的具体情况,但是如果您正在制作一个正确模板Control
而不是简单的UserControl
或Page
,你只是做
public class MyFancyControl : Control
{
public MyFancyControl()
{
this.DefaultStyleKey = typeof(MyFancyControl);
}
// ...
public override void OnApplyTemplate()
{
var myImage = this.GetTemplateChild("MyImageName") as Image;
}
}