2009-10-29 4 views
1

J'écris un programme qui doit accéder à des images à partir d'un format de fichier de données existant. (Pour être précis: le programme charge ses images d'interface utilisateur directement à partir des fichiers de données d'un ancien jeu) Puisque les images sont toutes stockées sous forme de fichiers Targa (TGA), je dois les pré-traiter en fichiers PNG. Je fais cela dans un dossier de données d'application local.Gestion des ressources WPF

Mon problème est d'écrire/créer des fichiers XAML en utilisant ces images. Comme je ne veux pas redistribuer les images (problèmes de copyright), je ne peux pas les inclure comme ressources dans mon application. Cela exclut la manière normale d'inclure des images dans les contrôles WPF. Ce que j'ai essayé avec succès est de mettre les images prétraitées dans le même répertoire que l'assemblage de l'application et de les référencer en utilisant "pack: // siteoforigin: ,,,/cache/image.png". Cela fonctionne également depuis le Concepteur XAML dans Visual Studio et Expression Blend 3.

Le problème avec cette approche est que le répertoire de l'application n'est pas forcément accessible en écriture en tant qu'utilisateur actuel (en particulier si l'application réside en C: \ Program Files), donc stocker les images pendant la phase de pré-processus est hors de question pour moi.

Une autre approche que j'ai utilisée avec succès est la création d'un protocole WebRequest personnalisé comme cache: // et l'utilise pour les URL d'image. Cela fonctionne dans l'application réelle, mais pas dans le concepteur de Visual Studio ou Expression Blend.

Quelqu'un est-il au courant d'un autre bon moyen de référencer des images dans le système de fichiers en utilisant WPF? Ou un moyen de personnaliser le chargement des ressources, compatible avec les solutions WPF Authoring habituelles?

Répondre

1

Pour répondre à ma propre question:

je devais mettre en œuvre deux MarkupExtensions: Celui qui crée une ImageSource et qui crée un ImageBrush. Ces classes ont créé les objets en utilisant des URL relatives (par rapport au cache local dans% appdata%).

Alors j'ai pu utiliser:

<Grid Background="{local:LocalImageBrush Filename=some/relative/filename.png}" /> 

Le code pour l'extension de balisage est:

class LocalImageBrush : MarkupExtension 
{ 
    public string Filename { get; set; } 

    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
    var result = new Uri("file:///" + ProfileDirectory.LocalDataPath + "/" + Filename); 
    return new ImageBrush(new BitmapImage(result)); 
    } 
} 

Cela fonctionne également dans l'IDE Visual Studio.

+0

Je serais intéressé de voir l'extension de balisage produire une ImageSource, mes tentatives jusqu'ici dans la production ont échoué – mostlytech

0

Vous pouvez écrire vos images dans un sous-dossier de% APPDATA% accessible en écriture. Vous obtenez le chemin avec Environment.SpecialFolder.ApplicationData

+1

Salut, ce n'est pas le problème. Je le fais déjà. Le problème fait référence à ces images à partir de fichiers XAML dans WPF. – Storm

Questions connexes