Eu vin dintr-o mare parte web și un pic Windows Forms fundal. Pentru un nou proiect, vom fi folosind WPF. WPF aplicație va avea nevoie de 10 - 20 de icoane mici si imaginile pentru scopuri ilustrative. Mă gândesc la stocarea acestora în ansamblul ca resursele încorporate. Este că modul corect de a merge?
Cum pot specifica în XAML că o Imagine de control ar trebui să încarce imaginea de la o încorporat resurse?
Dacă veți utiliza imaginea în mai multe locuri, apoi se's valoare de încărcarea imaginii datele numai o singură dată în memorie și apoi partajarea între toate "Imagine" elemente.
Pentru a face acest lucru, a crea un BitmapSource
ca o resursă pe undeva:
<BitmapImage x:Key="MyImageSource" UriSource="../Media/Image.png" />
Apoi, în codul dvs., utilizați ceva de genul:
<Image Source="{StaticResource MyImageSource}" />
În cazul meu, am constatat că am avut pentru a seta Imaginea lui.pngfișier să aibă o acțiune construi de
Resurse`, mai degrabă decât doar de "Conținut". Acest lucru face ca imaginea să fie efectuate în compilate de asamblare.
M-am dovedit a fi cea mai bună practică de a utiliza imagini, clipuri video, etc. este:
<Image Source="/WPFApplication;component/Images/Start.png" />
Beneficii:
Unii oameni se întreabă despre a face acest lucru în cod și nu primesc un răspuns.
După ce a petrecut mai multe ore de cautare am gasit o metoda foarte simpla, nu am găsit nici un exemplu și așa că am împărtășesc al meu aici care funcționează cu imagini. (a mea a fost .gif)
Rezumat:
Returnează un BitmapFrame care ImageSource "destinații" pare să-i placă.
Utilizare:
doGetImageSourceFromResource ("[YourAssemblyNameHere]", "[YourResourceNameHere]");
Metoda:
static internal ImageSource doGetImageSourceFromResource(string psAssemblyName, string psResourceName)
{
Uri oUri = new Uri("pack://application:,,,/" +psAssemblyName +";component/" +psResourceName, UriKind.RelativeOrAbsolute);
return BitmapFrame.Create(oUri);
}
Invataturi:
Din experiențele mele ambalaj șirul nu este problema, verifica fluxuri și mai ales dacă citești prima dată a stabilit indicatorul la sfârșitul de fișier și aveți nevoie pentru a re-seta la zero înainte de a citi din nou.
Sper că acest lucru vă salvează de la multe ore îmi doresc ca această piesă a avut-o pentru mine!
În cod pentru a încărca o resursă în executare de asamblare în cazul în care imaginea mea Freq.png a fost în dosarul
Icoaneși definit ca
Resurse`:
this.Icon = new BitmapImage(new Uri(@"pack://application:,,,/"
+ Assembly.GetExecutingAssembly().GetName().Name
+ ";component/"
+ "Icons/Freq.png", UriKind.Absolute));
Am făcut, de asemenea, o funcție:
/// <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));
}
Utilizare (ipoteza de a pune în funcție un ResourceHelper clasa):
this.Icon = ResourceHelper.LoadBitmapFromResource("Icons/Freq.png");
Notă: a se vedea [MSDN Pack-Uri în WPF][1]:
pachet://aplicarea:,,,/ReferencedAssembly;component/Subfolder/ResourceFile.xaml`
[1]: https://msdn.microsoft.com/en-us/library/aa970069(v=vs. 100).aspx
Descrierea completă modul de utilizare a resurselor: [WPF Cerere de Resurse, Conținut, și Fișiere de Date][1]
Și cum să le referință, citi "Pack-Uri în WPF".
Pe scurt, există chiar și mijloacele de referință a resurselor de referință/corelarea ansambluri.
[1]: https://msdn.microsoft.com/en-us/library/aa970494(v=vs. 100).aspx
Aceasta a lucrat pentru mine:
<BitmapImage x:Key="MyImageSource" UriSource="Resources/Image.png" />
Daca're folosind Amestec, pentru a face foarte ușor și nu am nici o probleme cu obtinerea calea corectă pentru Sursa atribut, doar drag and drop imaginea de la panoul de Proiect pe designer.
Da, l's calea cea dreaptă. Puteți folosi imagini în fișierul de Resurse, folosind o cale:
<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>
Următoarele lucrat și imagini pentru a fi setat este de resurse în proprietăți:
var bitmapSource = Imaging.CreateBitmapSourceFromHBitmap(MyProject.Properties.Resources.myImage.GetHbitmap(),
IntPtr.Zero,
Int32Rect.Empty,
BitmapSizeOptions.FromEmptyOptions());
MyButton.Background = new ImageBrush(bitmapSource);
img_username.Source = bitmapSource;