我有以下代码,它引用了xaml中的图像路径
<UserControl.Resources>
<system:String x:Key="SomeImage">\\somepath\\someimage.png</system:String>
</UserControl.Resources>
<Grid>
<Image Source="{Binding Path=VariablePath, Converter={StaticResource SomeConverter}, ConverterParameter={StaticResource SomeImage}}" />
</Grid>
说,我在代码中有数百个这样的图像。我需要代码中的这个图像列表进行一些处理。我想要的是将这些图像定义在一个地方并在代码和XAML中引用
像
这样的东西Dictionary <string,string> dict =
{
{"SomeImage", "\\somepath\\someimage.png"},
{"SomeImage2", "\\somepath2\\someimage.png"},
}
在Xaml中,引用图像
ConverterParameter={StaticResource dict["SomeImage"]}}"
代码
foreach(var item in dict)
{
//dosomething
}
希望要求是明确的。如何在代码和xaml中访问集合中的标签是可能的问题。
也欢迎其他想法。
答案 0 :(得分:0)
资源可以让您在xaml中轻松使用,但代码中没有迭代。
与转换器配合使用的暴露列表/字典可以解决这个问题但性能更差。
绑定到静态字典是我的选择。
您可以在XAML中使用它:
<Image Source="{Binding Source={x:Static local:YourClass.Images}, Path=Item[SomeImage]}"/>
(假设你的词典命名为&#34;图像&#34;以及词典所在的类别为#34; YourClass&#34;)
答案 1 :(得分:0)
如果XAML文件的结构是已知且可预测的,我自己会使用其中一种解决方案,因为我有很多用户控件应该在代码中作为集合处理:
1-如果所有控件都被Grid
,StackPanel
等容器包围,则可以通过以下方式循环检索容器子容器:
Dictionary<string, Image> images = new Dictionary<string,Image>();
foreach (var child in container.Children)
{
if (child is Image)
{
images.Add(
((Image) child).Name,
(Image) child);
}
}
2-我们可以在代码中构建控件集合,然后将它们作为子项或内容插入到容器中 作为一个例子,在下面的例子中,我们将一些ImageBrushes定义为App.xaml中的一些资源:
<ImageBrush x:Key="image_1_key" ImageSource="pack://application:,,,/path/to/image1.png" />
<ImageBrush x:Key="image_2_key" ImageSource="pack://application:,,,/path/to/image2.png" />
<ImageBrush x:Key="image_3_key" ImageSource="pack://application:,,,/path/to/image3.png" />
因此,我们可以根据资源构建控件,然后将它们插入到容器中:
Dictionary<string, ImageBrush> images = new Dictionary<string, ImageBrush>();
for (int i = 1; i <= 3; i++)
{
string name = String.Format("image_{0}", i);
string key = String.Format("image_{0}_key", i);
images.Add(name, (ImageBrush) App.Current.FindResource(key));
}
((Label) (container.Children[0])).Background = images["image_1"];