Всем привет! Меня всегда удивляла логика работы WinForm что не скажешь о WPF. Казалось бы что может быть проще простого использовать ресурсы хранящиеся в проекте. Но не все так просто конечно, хочется использовать те подходы которые реализованы в WinForm но они не работают. Гугление и решение на всех сайтах однотипные, что мне не нравилось и я хотел показать как альтернативный способ как можно использовать изображения из папки Resources. Основной для меня было динамическое подгрузка картинок из папки Resources.
Самый распространенный способ решения:
1 2 3 |
System.Windows.Media.Imaging.BitmapImage bit = new BitmapImage(new Uri("/Resources/1.jpg", UriKind.Relative)); img.Source = bit; |
Мы имеем папку Resources в котором есть изображение 1.jpg в качестве второго аргумента указываем относительный путь. Изображения я добавлял через свойства проекта>>Ресурсы.
Так же мы можем использовать Xaml для решения этой проблемы в случаи статичной картинки, однако если нам динамически придется изменять изображения этот вариант отпадает.
1 |
<Image x:Name="img" HorizontalAlignment="Left" VerticalAlignment="Top" Source="Resources/1.jpg" /> |
А вот теперь показываю тот способ который использую я:
1 2 3 4 5 6 7 |
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
1 2 3 4 5 6 7 8 9 10 11 12 |
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 при этом на не нужно знать имена файлов, мы динамически их подгружаем и используем в коде.