2010-11-02 5 views
2

D'après ce que j'ai vu, la source des images WPF est un objet BitmapSource tandis que les images Ressources sont lues en tant que bitmap. J'ai facilement trouvé un moyen de convertir des images à partir du format Bitmap en format BitmapSource mais je crois que l'exécution de cette conversion chaque fois que j'ai besoin d'une image est coûteuse en termes de performances et de consommation de mémoire (Les Bitmaps sont statiques mais je suppose conversion alloue un nouvel objet en mémoire pour le BitmapSource).Utilisation des images de ressources dans WPF

J'ai pensé à conserver un cache paresseux en mémoire pour les objets BitmapSource, de cette façon, je n'aurai besoin d'exécuter la conversion qu'une seule fois par image. Cependant, j'ai du mal à croire que c'est la bonne solution pour ce problème.

La nature de l'application est que les données s'étendent dans le temps et que les objets métier ne sont jamais éliminés. Par conséquent, cette hypothèse ne tiendra que dans le cas où l'implémentation maintiendra des ressources statiques pour ces images statiques.

J'apprécierai beaucoup la bonne solution pour ce problème.

Répondre

1

Je ne suis pas sûr de comprendre ce que vous voulez dire, mais vous pouvez utiliser Image from Resources comme ceci.
Si vous avez une ressource Image nommée "B1.png" et que vous définissez "Build Action" sur "Resource" pour cela, vous pouvez l'utiliser dans xaml comme ceci.

<Image Name="c_image" Source="/YourAssemblyName;component/Resources/B1.png" /> 

et dans le code derrière comme celui-ci

Image img = new Image(); 
BitmapImage bitmapImage = new BitmapImage(); 
bitmapImage.BeginInit(); 
bitmapImage.UriSource = new Uri("pack://application:,,,/YourAssemblyName;component/Resources/B1.png"); 
bitmapImage.EndInit(); 
img.Source = bitmapImage; 
+0

Meleak, merci pour la réponse. Je ne suis pas sûr de comprendre votre solution. J'ai deux questions: 1. Le code est-il obligatoire? La ressource peut-elle être utilisée directement dans le code XAML? 2. Savez-vous si le framework WPF exécutera la conversion derrière la scène ou si ce code est vraiment plus efficace? – sagibb

+0

@tutipute: Le code derrière est seulement pour créer une image dans le code derrière. La méthode xaml n'utilise aucun code derrière (donc oui, peut être utilisé directement dans xaml). Si vous ajoutez une image dans le concepteur, affichez ses propriétés et appuyez sur Source puis vous pouvez choisir la source dans une boîte de dialogue (toutes les ressources applicables seront affichées). Après cela, vous pouvez inspecter l'uri dans xaml. Notez que l'action de construction de la ressource doit être définie sur Resource. –

+0

@tutipute: Pour répondre à la question 2: C'est la façon d'utiliser les ressources pour Image dans WPF, donc je suis sûr que c'est plutôt optimisé. –