2011-09-03 8 views
1

Je développe une application Windows Forms et j'utiliserai des ensembles d'images (think icons). Selon le thème, différents ensembles d'images doivent être choisis (je les dessinerai plus tard en utilisant un Bitmap).Meilleure façon de stocker des ensembles d'images pour Windows Forms

Je pensais à stocker les images dans des fichiers séparés (fichiers d'archive? Dlls?), Puis les charger à l'exécution à partir de l'application principale. Quel serait le moyen le plus efficace de le faire?

Merci pour la lecture.

Répondre

2

Je vais répondre à cela en considérant quelques scénarios.

  1. Est-ce que ces images changent souvent? Ensuite, optez pour l'approche basée sur le répertoire, où stockez-le dans un répertoire et chargez-le. Peut être que vous pouvez avoir un xml ayant les noms de ces fichiers à charger. Alors changement de nom dans les fichiers (images), il suffit de changer xml.

  2. Ces fichiers ne change jamais? Ensuite, il suffit de les incorporer comme ressources, de telle sorte qu'il sera intégré dans votre exe/dll et aucun ne peut corrompre les images.

Normalement, j'ai vu des gens ne pas faire d'intégration.

+0

Comment puis-je intégrer les images en tant que ressources et créer une ressource distincte pour chaque thème? – csq

+1

En studio visuel, accédez aux propriétés du projet et aux ressources. Là sélectionnez l'image et ajoutez. Jouez un peu plus avec VS;) – Zenwalker

+0

Alors comment vais-je utiliser les images dans un autre projet? – csq

0

Avez-vous pensé à utiliser des fichiers resx (fichiers de ressources)? De cette façon, vous pouvez intégrer des images (icônes), ou ce que vous voulez et décider de charger uniquement le fichier de ressources nécessaires en fonction de votre thème (les fichiers de ressources peuvent être nommés en fonction des noms de vos thèmes). On dirait que le même problème rencontré lors de la localisation, n'est-ce pas? Mais pour savoir si c'est la meilleure façon de le faire (performance, mémoire, etc.), je ne peux pas le dire.

0

Vous ne savez pas si vous avez trouvé la réponse que vous recherchiez. Voici une étape par étape pour créer une dll de ressources

  1. Créer un nouveau projet dans Visual Studio, bibliothèque de classes
  2. Ajouter vos ressources (images) au projet (Ajouter un élément existant)
  3. Pour chaque ressources, dans la fenêtre propriétés, définissez Construire action ressource incorporée
  4. compiler la bibliothèque, produit une dll
  5. dans votre application winForms, vous pouvez maintenant charger cette assemblée à l'exécution (code n ° 1)
  6. charge la ressource diffuser ce vous voulez et l'enregistrer sur un objet Bitmap (Code # 2)

Code # 1

Assembly ambly = Assembly.LoadFile(pathToDll); 

Code # 2

BitMap bitMap; 
// where "ns" is the default namespace of the resource project  
using (Stream resourceStream = ambly.GetManifestResourceSream("ns.image.jpg")) 
{ 
     bitMap = BitMap.FromStream(resourceStream); 
} 

Ce sont les techniques de base utilisées pour l'intégration des ressources et les charger à l'exécution. Maintenant, puisque vous envisagez d'avoir des thèmes différents, et de stocker les ressources pour chaque thème dans différentes bibliothèques, vous devriez avoir une interface qui spécifie une sorte de gestionnaire de ressources, défini dans votre application principale.

Un exemple

interface IThemeResourceProvider 
{ 
    Stream LoadBigLogo(); 
    Stream LoadSmallLogo(); 
} 

mettre en œuvre ensuite cette interface dans votre bibliothèque de ressources

public class ThemeResourceProvider : IThemeResourceProvider 
{ 
    public Stream LoadBigLogo() 
    { 
     Assembly ambly = Assembly.GetExecutingAssembly(); 
     return ambly.GetManifestResourceStream("namespace.image.jpg"); 
    } 

    (...) 
} 

Enfin, au lieu de charger la ressource directement dans votre application principale, vous instancier le IThemeResourceProvider trouvé dans la bibliothèque de ressources

Assembly assembly = Assembly.LoadFile(pathToDll); 

var results = from type in assembly.GetTypes() 
       where typeof(IThemeResourceProvider).IsAssignableFrom(type) 
       select type; 

Maintenant vous avez un IEnumerable<Type> dans cette liste. En général, vous n'en avez qu'une, mais en utilisant cette approche, vous pouvez également héberger plusieurs ensembles de ressources et implémenter plusieurs IThemeResourceProviders dans la même DLL de ressources. Vous pourriez, par exemple, identifier chaque IThemeResourceProvider avec un nom, soit comme une propriété, ou en utilisant une décoration personnalisée [Attribute] sur vos différentes implémentations. Je vais laisser le reste à toi pour comprendre.

Mais voici comment instancier les IThemeResourceProviders dans votre liste

foreach (var providerType in results) 
{ 
    var constructorInfo = providerType.GetConstructor(Type.EmptyTypes); 
    IThemeResourceProvider provider = constructorInfo.Invoke(null); 
} 

Et enfin, en utilisant un de ces fournisseurs pour obtenir une image bitmap:

BitMap bitMap; 
using (Stream resourceStream = provider.LoadBigLogo()) 
{ 
     bitMap = BitMap.FromStream(resourceStream); 
} 
+0

Cette approche fait-elle une différence de performance? –

Questions connexes