Domanda

Vengo da uno sfondo prevalentemente Web e Windows Forms. Per un nuovo progetto, utilizzeremo WPF. L'applicazione WPF avrà bisogno di 10-20 piccole icone e immagini a scopo illustrativo. Sto pensando di archiviarli nell'assembly come risorse incorporate. È la strada giusta da percorrere?

Come posso specificare in XAML che un controllo Image dovrebbe caricare l'immagine da una risorsa incorporata?

È stato utile?

Soluzione

Se utilizzerai l'immagine in più punti, vale la pena caricare i dati dell'immagine solo una volta in memoria e condividerli tra tutti gli elementi Image .

Per fare ciò, crea un BitmapSource come risorsa da qualche parte:

<BitmapImage x:Key="MyImageSource" UriSource="../Media/Image.png" />

Quindi, nel tuo codice, usa qualcosa come:

<Image Source="{StaticResource MyImageSource}" />

Nel mio caso, ho scoperto che dovevo impostare il file Image.png per avere un'azione di costruzione di Resource anziché solo Content . Questo fa sì che l'immagine venga trasportata all'interno dell'assieme compilato.

Altri suggerimenti

Ho scoperto che la migliore pratica di utilizzo di immagini, video, ecc. è:

  • Modifica i tuoi file " Crea azione " in " Contenuto " . Assicurati di selezionare Copia per compilare la directory .
    • Trovato nel pulsante "quot-click destro" " menu nella finestra Esplora soluzioni.
  • Fonte immagine nel seguente formato:
    • " / & # 171; YourAssemblyName & # 187; , componente / & # 171; yourpath & # 187; / & # 171; YourImage.png & # 187; "

Esempio

<Image Source="/WPFApplication;component/Images/Start.png" />

I vantaggi:

  • I file non sono incorporati nell'assieme.
    • Resource Manager solleverà alcuni problemi di overflow della memoria con troppe risorse (al momento della compilazione).
  • Può essere chiamato tra assiemi.

Alcune persone chiedono di farlo nel codice e di non ottenere una risposta.

Dopo aver trascorso molte ore a cercare ho trovato un metodo molto semplice, non ho trovato alcun esempio e quindi condivido il mio qui che funziona con le immagini. (il mio era un .gif)

Sommario:

Restituisce un BitmapFrame quale ImageSource " destinazioni " sembra piacere.

Usa:

doGetImageSourceFromResource ("[YourAssemblyNameHere]", "[YourResourceNameHere]");

Metodo:

static internal ImageSource doGetImageSourceFromResource(string psAssemblyName, string psResourceName)
{
    Uri oUri = new Uri("pack://application:,,,/" +psAssemblyName +";component/" +psResourceName, UriKind.RelativeOrAbsolute);
    return BitmapFrame.Create(oUri);
}

apprendimenti:

Dalle mie esperienze, la stringa del pacchetto non è un problema, controlla i tuoi stream e soprattutto se leggendolo la prima volta hai impostato il puntatore alla fine del file ed è necessario reimpostarlo su zero prima di rileggere.

Spero che questo ti salvi le molte ore che vorrei che questo pezzo avesse per me!

Nel codice per caricare una risorsa nell'assembly in esecuzione dove la mia immagine Freq.png era nella cartella Icone e definita come Resource :

this.Icon = new BitmapImage(new Uri(@"pack://application:,,,/" 
    + Assembly.GetExecutingAssembly().GetName().Name 
    + ";component/" 
    + "Icons/Freq.png", UriKind.Absolute)); 

Ho anche fatto una funzione:

/// <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)); 
}

Utilizzo (si supponga di aver inserito la funzione in una classe ResourceHelper):

this.Icon = ResourceHelper.LoadBitmapFromResource("Icons/Freq.png");

Nota : vedi URI MSDN Pack in WPF :
pack://application:,,,/ReferencedAssembly;component/Subfolder/ResourceFile.xaml

Sì, è nel modo giusto.

È possibile utilizzare l'immagine nel file di risorse semplicemente usando il percorso:

<Image Source="..\Media\Image.png" />

Devi impostare l'azione di compilazione del file immagine su " Resource " ;.

Descrizione completa come utilizzare le risorse: File di risorse, contenuti e dati dell'applicazione WPF

E come fare riferimento a questi, leggi " Pack URI in WPF " ;.

In breve, ci sono anche mezzi per fare riferimento a risorse da assiemi referenziati / referenziati.

  1. Visual Studio 2010 Professional SP1.
  2. Profilo client di .NET Framework 4.
  3. Immagine PNG aggiunta come risorsa sulle proprietà del progetto.
  4. Nuovo file nella cartella Risorse creato automaticamente.
  5. Crea azione impostata su risorsa.

Questo ha funzionato per me:

<BitmapImage x:Key="MyImageSource" UriSource="Resources/Image.png" />

Se stai usando Blend , per renderlo ancora più semplice e senza problemi ottenere il percorso corretto per l'attributo Sorgente , trascina e rilascia l'immagine dal pannello Progetto sul designer.

Sì, è la strada giusta. Puoi utilizzare le immagini nel file di risorse usando un percorso:

<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>

Il seguente ha funzionato e le immagini da impostare sono risorse nelle proprietà:

    var bitmapSource = Imaging.CreateBitmapSourceFromHBitmap(MyProject.Properties.Resources.myImage.GetHbitmap(),
                                      IntPtr.Zero,
                                      Int32Rect.Empty,
                                      BitmapSizeOptions.FromEmptyOptions());
    MyButton.Background = new ImageBrush(bitmapSource);
img_username.Source = bitmapSource;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top