c# - fond - image xaml




Ressources d'image WPF (7)

Je viens d'un environnement principalement web et un peu Windows Forms. Pour un nouveau projet, nous utiliserons WPF. L'application WPF aura besoin de 10 à 20 petites icônes et images à des fins d'illustration. Je pense à stocker ces éléments dans l'assemblage en tant que ressources intégrées. Est-ce la bonne façon d'y aller?

Comment puis-je spécifier dans XAML qu'un contrôle Image doit charger l'image à partir d'une ressource incorporée?


  1. Visual Studio 2010 Professional SP1.
  2. Profil client .NET Framework 4.
  3. Image PNG ajoutée en tant que ressource sur les propriétés du projet.
  4. Nouveau fichier dans le dossier Ressources créé automatiquement.
  5. Construire l'action définie sur la ressource.

Cela a fonctionné pour moi:

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

Cela a fonctionné

et les images à définir sont des ressources dans les propriétés

    var bitmapSource = Imaging.CreateBitmapSourceFromHBitmap(MyProject.Properties.Resources.myImage.GetHbitmap(),
                                      IntPtr.Zero,
                                      Int32Rect.Empty,
                                      BitmapSizeOptions.FromEmptyOptions());
    MyButton.Background = new ImageBrush(bitmapSource);
img_username.Source = bitmapSource;

Dans le code pour charger une ressource dans l'assembly executiong où mon image Freq.png était dans les Icons dossier et définie comme Resource :

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

J'ai également fait une fonction si quelqu'un peut l'utiliser:

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

Utilisation (supposition que vous avez placé la fonction dans une classe ResourceHelper):

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

Remarque : consultez les URI de pack MSDN dans WPF :
pack://application:,,,/ReferencedAssembly;component/Subfolder/ResourceFile.xaml



Si vous utilisez blend, pour le rendre plus facile et ne pas avoir de problème pour obtenir le bon chemin pour l'attribut Source, faites simplement glisser l'image du panneau Projet sur le concepteur.


oui c'est juste. Vous pouvez utiliser des images dans le fichier de ressources en utilisant le chemin

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

Si vous souhaitez utiliser l'image à plusieurs endroits, il est préférable de charger les données d'image une seule fois en mémoire, puis de les partager entre tous les éléments Image .

Pour ce faire, créez un BitmapSource tant que ressource quelque part:

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

Ensuite, dans votre code, utilisez quelque chose comme:

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

Dans mon cas, j'ai trouvé que je devais définir le fichier Image.png pour avoir une action de construction de Resource plutôt que simplement du Content . Cela provoque le transport de l'image dans votre assembly compilé.





embedded-resource