Aku datang dari sebagian besar web dan sedikit Windows Forms latar belakang. Untuk sebuah proyek baru, kita akan menggunakan WPF. Aplikasi WPF akan membutuhkan 10 - 20 ikon kecil dan gambar untuk tujuan ilustrasi. Saya berpikir tentang menyimpan ini dalam perakitan seperti yang tertanam sumber daya. Adalah bahwa cara yang tepat untuk pergi?
Bagaimana cara menentukan dalam XAML yang Gambar kontrol harus memuat gambar dari sumber daya yang tertanam?
Jika anda akan menggunakan gambar di beberapa tempat, maka's senilai memuat data gambar hanya sekali ke dalam memori dan kemudian berbagi di antara semua Gambar
elemen.
Untuk melakukan ini, membuat BitmapSource
sebagai sumber daya di suatu tempat:
<BitmapImage x:Key="MyImageSource" UriSource="../Media/Image.png" />
Kemudian, dalam kode anda, menggunakan sesuatu seperti:
<Image Source="{StaticResource MyImageSource}" />
Dalam kasus saya, saya menemukan bahwa saya harus mengatur Gambar.png
file untuk membangun aksi Sumber daya
bukan hanya Konten
. Hal ini menyebabkan gambar yang akan dilakukan dalam menyusun perakitan.
Yang saya temukan untuk menjadi yang terbaik praktek menggunakan gambar, video, dll. adalah:
<Image Source="/WPFApplication;component/Images/Start.png" />
Manfaat:
File - file yang tidak tertanam ke dalam majelis.
Beberapa orang yang bertanya tentang melakukan hal ini dalam kode dan tidak mendapatkan jawaban.
Setelah menghabiskan berjam-jam mencari saya menemukan metode yang sangat sederhana, saya tidak menemukan contoh dan jadi saya berbagi saya di sini yang bekerja dengan gambar. (saya adalah seorang .gif)
Ringkasan:
Ia mengembalikan BitmapFrame yang ImageSource "tujuan" tampaknya seperti.
Gunakan:
doGetImageSourceFromResource ("[YourAssemblyNameHere]", "[YourResourceNameHere]");
Metode:
static internal ImageSource doGetImageSourceFromResource(string psAssemblyName, string psResourceName)
{
Uri oUri = new Uri("pack://application:,,,/" +psAssemblyName +";component/" +psResourceName, UriKind.RelativeOrAbsolute);
return BitmapFrame.Create(oUri);
}
Pembelajaran:
Dari pengalaman saya pak string tidak masalah, periksa aliran dan terutama jika membaca ini pertama kalinya telah mengatur pointer ke akhir file dan anda perlu untuk mengatur ulang ke nol sebelum membaca lagi.
Saya berharap ini menghemat banyak jam saya berharap karya ini punya untuk saya!
Dalam kode untuk memuat sumber daya dalam melaksanakan perakitan di mana saya gambar Freq.png
di folder Ikon
dan didefinisikan sebagai Sumber daya
:
this.Icon = new BitmapImage(new Uri(@"pack://application:,,,/"
+ Assembly.GetExecutingAssembly().GetName().Name
+ ";component/"
+ "Icons/Freq.png", UriKind.Absolute));
Saya juga membuat fungsi:
/// <summary>
/// Load a resource WPF-BitmapImage (png, bmp, ...) from embedded resource defined as 'Resource' not as 'Embedded resource'.
/// </summary>
/// <param name="pathInApplication">Path without starting slash</param>
/// <param name="assembly">Usually 'Assembly.GetExecutingAssembly()'. If not mentionned, I will use the calling assembly</param>
/// <returns></returns>
public static BitmapImage LoadBitmapFromResource(string pathInApplication, Assembly assembly = null)
{
if (assembly == null)
{
assembly = Assembly.GetCallingAssembly();
}
if (pathInApplication[0] == '/')
{
pathInApplication = pathInApplication.Substring(1);
}
return new BitmapImage(new Uri(@"pack://application:,,,/" + assembly.GetName().Name + ";component/" + pathInApplication, UriKind.Absolute));
}
Penggunaan (asumsi anda menempatkan fungsi dalam ResourceHelper kelas):
this.Icon = ResourceHelper.LoadBitmapFromResource("Icons/Freq.png");
Catatan: lihat [MSDN Pak Uri di WPF][1]:
pack://aplikasi:,,,/ReferencedAssembly;komponen/Subfolder/ResourceFile.xaml
[1]: https://msdn.microsoft.com/en-us/library/aa970069(v=vs. 100).aspx
Deskripsi lengkap bagaimana menggunakan sumber daya: [Aplikasi WPF Sumber daya, Konten, dan Data File][1]
Dan bagaimana untuk referensi mereka, baca "Pak Uri di WPF".
Dalam jangka pendek, bahkan ada sarana untuk sumber referensi dari dirujuk/referensi rakitan.
[1]: https://msdn.microsoft.com/en-us/library/aa970494(v=vs. 100).aspx
Ini bekerja untuk saya:
<BitmapImage x:Key="MyImageSource" UriSource="Resources/Image.png" />
Jika anda're menggunakan Campuran, untuk membuatnya yang mudah dan tidak mengalami kesulitan mendapatkan jalan yang tepat untuk Sumber atribut, hanya drag dan drop gambar dari panel Proyek ke desainer.
Ya, itu's cara yang tepat. Anda dapat menggunakan gambar dalam file Sumber daya menggunakan path:
<StackPanel Orientation="Horizontal">
<CheckBox Content="{Binding Nname}" IsChecked="{Binding IsChecked}"/>
<Image Source="E:\SWorking\SharePointSecurityApps\SharePointSecurityApps\SharePointSecurityApps.WPF\Images\sitepermission.png"/>
<TextBlock Text="{Binding Path=Title}"></TextBlock>
</StackPanel>
Berikut bekerja dan gambar yang akan mengatur sumber daya di properties:
var bitmapSource = Imaging.CreateBitmapSourceFromHBitmap(MyProject.Properties.Resources.myImage.GetHbitmap(),
IntPtr.Zero,
Int32Rect.Empty,
BitmapSizeOptions.FromEmptyOptions());
MyButton.Background = new ImageBrush(bitmapSource);
img_username.Source = bitmapSource;