Использование пути к файлам, хранящимся в настройках приложения - PullRequest
2 голосов
/ 27 марта 2010

Я пытаюсь разработать приложение, которое использует несколько изображений, которые хранятся в отдельном удаленном местоположении файла. Пути к файлам элементов пользовательского интерфейса хранятся в настройках приложения. Хотя я понимаю, как получить доступ и использовать путь к файлу из настроек в C # (Properties.Settings.Default.pathToGridImages + "OK.png"), я затрудняюсь понять, как использовать пути настроек в WPF, и может показаться, что доступ к файлу возможен только при включении пути к файлу, например:

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

Я бы подумал, что объединение «Properties.Settings.Default.pathToGridImages» с «bottomfill.png» в WPF можно сделать так же, как это можно сделать в C #. Кто-нибудь может указать мне правильное направление?

1 Ответ

2 голосов
/ 27 марта 2010

Вы можете сделать это, используя 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();
    }
}

Очевидно, что вам нужно объявить пространства имен и ресурсы для CLR в XAML, чтобы вы могли получить к ним доступ (если вы назвали свои настройки и классы конвертера как-то по-другому, убедитесь, что вы изменили это для соответствия):

...
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 #, но это будет зависеть от того, как вы настроили свои константы данных, поэтому может быть нежелательным в много дел.]

...