c# source Risorse immagine WPF




wpf images in resources (8)

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?


Se stai usando Blend , per renderlo più facile e non avere problemi a trovare il percorso corretto per l'attributo Source , basta trascinare e rilasciare l'immagine dal pannello Progetto sul designer.


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.


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


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


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

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.

Quanto segue ha funzionato e le immagini da impostare sono risorse in 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;




embedded-resource