2

我正在尝试开发一个应用程序,该应用程序使用存储在单独的远程文件位置的多个图像。UI 元素的文件路径存储在应用程序设置中。尽管我了解如何从 C# 中的 Settings (Properties.Settings.Default.pathToGridImages + "OK.png") 访问和使用文件路径,但我不知道如何在 WPF 中使用 Settings 路径,并且如果我包含文件路径,似乎只能访问该文件,例如:

<Grid.Background>
     <ImageBrush ImageSource="C:\Skins\bottomfill.png" TileMode="Tile" />
</Grid.Background>

我原以为在 WPF 中将“Properties.Settings.Default.pathToGridImages”与“bottomfill.png”连接起来可以像在 C# 中那样完成。谁能指出我正确的方向?

4

1 回答 1

2

您可以使用MultiBinding和值转换器来执行此操作。首先,使用多重绑定将图像源绑定到基本路径和图像名称:

<ImageBrush>
    <ImageBrush.ImageSource>
        <MultiBinding Converter="{StaticResource MyConverter}">
            <Binding Source="{StaticResource MySettings}" Path="Default.FilePath" />
            <Binding Source="ImageName.png"></Binding>
        </MultiBinding>
    </ImageBrush.ImageSource>
</ImageBrush>

然后,您需要有一个转换器来实现IMultiValueConverter并组合路径的两个部分并使用ImageSourceConverter或通过创建新的BitmapImage创建图像:

class MyConverter: IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        // Concatenate the values.
        string filename = Path.Combine(values[0].ToString(), values[1].ToString());

        // You can either use an ImageSourceConverter
        // to create your image source from the path.
        ImageSourceConverter imageConverter = new ImageSourceConverter();
        return imageConverter.ConvertFromString(filename);

        // ...or you can create a new bitmap with the combined path.
        return new BitmapImage(new Uri(filename, UriKind.RelativeOrAbsolute));
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        // No need to implement the convert back as this will never be used in two way binding.
        throw new NotImplementedException();
    }
}

显然,您需要在 XAML 中为 CLR 内容声明命名空间和资源,以便您可以访问它(如果您已将设置和转换器类称为不同的名称,请确保将其更改为匹配):

...
xmlns:local ="clr-namespace:WpfApplication1">
<Window.Resources>
    <local:MyConverter x:Key="MyConverter"></local:MyConverter>
    <local:MySettings x:Key="MySettings"></local:MySettings>
</Window.Resources>

我已经测试过了,它工作正常。

[另一种方法是将 ImageSource 属性绑定到数据上下文中的一个属性,该属性组合了 C# 代码中的路径,但这取决于您如何设置数据上下文,因此在许多情况下可能是不可取的。 ]

于 2010-03-27T12:47:50.770 回答