Предварительно загрузить ресурсы изображения с помощью .NET/WPF

Я хочу предварительно загрузить ресурсы изображения при запуске приложения. Изображения должны кэшироваться в памяти приложения. Поэтому я могу использовать предварительно загруженные изображения в своем приложении.

Проблема, если я загружаю конкретное представление с большим количеством изображений внутри, приложение зависает на несколько секунд, после этого представление появится. Приложение основано на XAML, но исходное свойство элементов управления изображением динамически изменяется.

Я проверил несколько вещей, но ничего не работает.

var uri = new Uri ( "pack://application:,,,/Vibrafit.Demo;component/Resources/myImage.jpg", UriKind.RelativeOrAbsolute ); //unit.Image1Uri;
var src = new BitmapImage ( uri );
src.CacheOption = BitmapCacheOption.None;
src.CreateOptions = BitmapCreateOptions.None;

src.DownloadFailed += delegate {
    Console.WriteLine ( "Failed" );
};

src.DownloadProgress += delegate {
    Console.WriteLine ( "Progress" );
};

src.DownloadCompleted += delegate {
    Console.WriteLine ( "Completed" );
};

но изображение не загружается. Единственный способ загрузить изображение — показать его на экране в элементе управления изображением и назначить свойство-источник моему вновь созданному объекту BitmapImage-Object. Но я не хочу показывать все изображения при запуске.


person RonnyCSHARP    schedule 17.02.2015    source источник


Ответы (1)


Если вы хотите, чтобы изображение загружалось немедленно, вам нужно установить этот параметр кеша:

src.CacheOption = BitmapCacheOption.OnLoad;

В противном случае он загружается по запросу при первом доступе к данным (или, в вашем случае, каждый раз, когда вы пытаетесь получить доступ к данным изображения, поскольку вы выбираете None).

См. документацию< /а>

Кроме того, вы устанавливаете UriSource перед настройкой параметров кэша. Итак, попробуйте что-то вроде (из головы, не могу проверить прямо сейчас):

var uri = new Uri ( "pack://application:,,,/Vibrafit.Demo;component/Resources/myImage.jpg", UriKind.RelativeOrAbsolute ); //unit.Image1Uri;
var src = new BitmapImage ();
src.BeginInit();
src.CacheOption = BitmapCacheOption.OnLoad;
src.CreateOptions = BitmapCreateOptions.None;
src.DownloadFailed += delegate {
    Console.WriteLine ( "Failed" );
};

src.DownloadProgress += delegate {
    Console.WriteLine ( "Progress" );
};

src.DownloadCompleted += delegate {
    Console.WriteLine ( "Completed" );
};
src.UriSource = uri;
src.EndInit();
person Jcl    schedule 17.02.2015
comment
Привет, я проверил все варианты. Также под нагрузкой. Но это не работает. Мне нужен метод для загрузки BitmapImage, даже когда изображение не отображается. С уважением - person RonnyCSHARP; 17.02.2015
comment
Проблема в том, что вы устанавливаете UriSource перед установкой параметров кеша (в параметре конструктора). Смотрите мою правку. Извините, не могу проверить прямо сейчас, но я думаю, что это проблема. - person Jcl; 17.02.2015
comment
Я добавил ответ. Ниже мой вопрос. - person RonnyCSHARP; 17.02.2015