Управление ресурсами WPF - PullRequest
       10

Управление ресурсами WPF

1 голос
/ 29 октября 2009

Я пишу программу, которая должна получить доступ к изображениям из устаревшего формата файла данных. (Если быть точным: программа загружает свои изображения интерфейса непосредственно из файлов данных старой игры) Поскольку все изображения хранятся в виде файлов Targa (TGA), я должен предварительно обработать их в файлы PNG. Я делаю это в локальной папке данных приложения.

Моя проблема - написание / авторизация файлов XAML с использованием этих изображений. Поскольку я не хочу распространять изображения (проблемы с авторским правом), я не могу просто включить их в качестве ресурсов в свое приложение. Это исключает обычный способ включения изображений в элементы управления WPF.

Я успешно попробовал поместить предварительно обработанные изображения в тот же каталог, что и сборка приложения, и сослаться на них, используя «pack: // siteoforigin: ,,, / cache / image.png». Это также работает в XAML Designer в Visual Studio и в Expression Blend 3.

Проблема с этим подходом заключается в том, что каталог приложения не всегда доступен для записи как текущий пользователь (особенно, если приложение находится в C: \ Program Files), поэтому хранение там изображений на этапе предварительной обработки находится вне вопрос для меня.

Альтернативный подход, который я успешно использовал, - это создание собственного протокола WebRequest, такого как cache: //, и его использование для URL-адресов изображений. Это работает в реальном приложении, но не в дизайнере Visual Studio или Expression Blend.

Кто-нибудь знает еще один хороший способ ссылки на изображения в файловой системе с помощью WPF? Или каким-то образом настроить загрузку ресурсов, совместимую с обычными решениями WPF Authoring?

Ответы [ 2 ]

1 голос
/ 30 октября 2009

Чтобы ответить на мой вопрос:

Мне пришлось реализовать два MarkupExtensions: один, который создает ImageSource и один, который создает ImageBrush. Эти классы создавали объекты с использованием относительных URL (относительно локального кэша в% appdata%).

Тогда я смог использовать:

<Grid Background="{local:LocalImageBrush Filename=some/relative/filename.png}" />

Код для расширения разметки:

class LocalImageBrush : MarkupExtension
{
  public string Filename { get; set; }

  public override object ProvideValue(IServiceProvider serviceProvider)
  {
    var result = new Uri("file:///" + ProfileDirectory.LocalDataPath + "/" + Filename);
    return new ImageBrush(new BitmapImage(result));
  }
}

Это также работает в Visual Studio IDE.

0 голосов
/ 29 октября 2009

Вы можете записать свои изображения в подпапку% APPDATA%, которая доступна для записи. Вы получаете путь с Environment.SpecialFolder.ApplicationData

...