在XAML中引用集合值

时间:2017-01-20 17:06:59

标签: c# wpf xaml

我有以下代码,它引用了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中访问集合中的标签是可能的问题。

也欢迎其他想法。

2 个答案:

答案 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-如果所有控件都被GridStackPanel等容器包围,则可以通过以下方式循环检索容器子容器:

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"];