Всем привет! Меня всегда удивляла логика работы WinForm что не скажешь о WPF. Казалось бы что может быть проще простого использовать ресурсы хранящиеся в проекте. Но не все так просто конечно, хочется использовать те подходы которые реализованы в WinForm но они не работают. Гугление и решение на всех сайтах однотипные, что мне не нравилось и я хотел показать как альтернативный способ как можно использовать изображения из папки Resources. Основной для меня было динамическое подгрузка картинок из папки Resources.
Самый распространенный способ решения:
System.Windows.Media.Imaging.BitmapImage bit =
new BitmapImage(new Uri("/Resources/1.jpg", UriKind.Relative));
img.Source = bit;
Мы имеем папку Resources в котором есть изображение 1.jpg в качестве второго аргумента указываем относительный путь. Изображения я добавлял через свойства проекта>>Ресурсы.
Так же мы можем использовать Xaml для решения этой проблемы в случаи статичной картинки, однако если нам динамически придется изменять изображения этот вариант отпадает.
<Image x:Name="img" HorizontalAlignment="Left" VerticalAlignment="Top" Source="Resources/1.jpg" />
А вот теперь показываю тот способ который использую я:
ResourceManager resMan =WpfApp.Properties.Resources.ResourceManager;
Bitmap bm = (Bitmap)resMan.GetObject("_1");
BitmapSource bit = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
bm.GetHbitmap(), IntPtr.Zero,Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
img.Source = bit;
WpfApp это namespace дальше указывается полный путь до изображения.
_1 это имя которое было задано автоматически при добавлении файла 1.jpg.
А теперь показываю как динамически изменять изображения из папки Resources
ResourceManager resMan = WpfApp.Properties.Resources.ResourceManager;
ResourceSet resourceSet = resMan.GetResourceSet(CultureInfo.CurrentUICulture, true, true);
IDictionaryEnumerator id = resourceSet.GetEnumerator();
while (id.MoveNext())
{
Bitmap br = (Bitmap)id.Value;
BitmapSource bit = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
br.GetHbitmap(),IntPtr.Zero,Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
img.Source = bit;
await Task.Delay(2000);
}
Этот блок кода позволяет загрузить все изображения в коллекцию и вставлять их с задержкой в 2 секунды в компонент Image wpf при этом на не нужно знать имена файлов, мы динамически их подгружаем и используем в коде.
