WPF image resurse

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?

Soluția

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:

Apoi, în codul dvs., utilizați ceva de genul:

În cazul meu, am constatat că am avut pentru a seta Imaginea lui.pngfișier să aibă o acțiune construi deResurse`, mai degrabă decât doar de "Conținut". Acest lucru face ca imaginea să fie efectuate în compilate de asamblare.

Comentarii (6)

M-am dovedit a fi cea mai bună practică de a utiliza imagini, clipuri video, etc. este:

  • Modifica fișierele "a Construi acțiune" la "Content". Fi sigur de a verifica Copie a construi director.
  • A găsit pe "Faceți Clic pe" meniu în fereastra Solution Explorer.
  • Sursa imaginii în următorul format:
  • "/«YourAssemblyName»;component/«YourPath»/«YourImage.png»"

Exemplu

Beneficii:

  • Fișiere nu sunt încorporate în ansamblul.
  • Resource Manager va ridica un preaplin de memorie probleme cu prea multe resurse (în timp construi).
  • Poate fi numit între ansambluri.
Comentarii (8)

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!

Comentarii (0)

În cod pentru a încărca o resursă în executare de asamblare în cazul în care imaginea mea Freq.png a fost în dosarulIcoaneși definit caResurse`:

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:


/// 
/// Load a resource WPF-BitmapImage (png, bmp, ...) from embedded resource defined as 'Resource' not as 'Embedded resource'.
/// 
/// <param name="pathInApplication">Path without starting slashUsually 'Assembly.GetExecutingAssembly()'. If not mentionned, I will use the calling assembly
Comentarii (5)

Da, este corect.

Ai putea folosi imaginea în fișierul de resurse doar folosind calea:

Trebuie să setați construi acțiune de fișier imagine pentru a "Resurse".

Comentarii (2)

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

Comentarii (1)
  1. Visual Studio 2010 Professional SP1.
  2. .NET Framework 4 Client Profile.
  3. Imagine PNG adăugat ca resursă pe proprietăți proiect.
  4. Nou fișier în directorul de Resurse creat automat.
  5. Construi acțiune set de resurse.

Aceasta a lucrat pentru mine:

Comentarii (0)

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.

Comentarii (0)

Da, l's calea cea dreaptă. Puteți folosi imagini în fișierul de Resurse, folosind o cale:





Comentarii (0)

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;
Comentarii (1)