c# - from - wpf images in resources




Risorse immagine WPF (7)

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

Questo ha funzionato per me:

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

Vengo da uno sfondo prevalentemente web e un po 'di Windows Form. 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 fare?

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


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

Dopo aver passato molte ore di ricerca, ho trovato un metodo molto semplice, non ho trovato esempi e quindi condivido il mio qui che funziona con le immagini. (il mio era un .gif)

Sommario:

Restituisce un BitmapFrame a cui sembrano piacere le "destinazioni" di ImageSource.

Uso:

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 è il problema, controlla i tuoi stream e soprattutto se la lettura la prima volta ha impostato il puntatore alla fine del file e devi reimpostarlo a zero prima di leggere di nuovo.

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


Ho trovato la migliore pratica di usare immagini, video, ecc. È:

  • Cambia i tuoi file "Crea azione" in "Contenuto" . Assicurati di selezionare Copia per compilare la directory .
    • Trovato nel menu "Click-destro" nella finestra Solution Explorer.
  • Fonte immagine nel seguente formato:
    • "/ « YourAssemblyName » ; componente /« YourPath »/ « YourImage.png » "

Esempio

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

Benefici:

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

Nel codice per caricare una risorsa nell'assembly in esecuzione dove la mia immagine Freq.png era nella cartella Icons 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 suppone di aver inserito la funzione in una classe ResourceHelper):

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

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


Sì, è la strada giusta. È possibile utilizzare le immagini nel file di risorse utilizzando 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>

Sì, è la strada giusta.

Potresti usare l'immagine nel file di risorse usando solo il percorso:

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

È necessario impostare l'azione di creazione del file immagine su "Risorsa".


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

Per fare ciò, crea una 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 compilazione di Resource anziché solo Content . Questo fa sì che l'immagine venga trasportata all'interno del tuo assembly compilato.





embedded-resource