2010-05-27 6 views
1

je le ci-dessous XAML simples:Problème d'afficher une image locale de XAML

<Window x:Class="WpfApplication1.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300"> 
    <Grid> 
    <Image Source="happyface.jpg"/> 
    </Grid> 
</Window> 

happyface.jpg est inclus dans le projet et son action de construction est réglé sur « contenu » et Copier vers Ouptput Directory est réglé sur "Toujours copier".

Lorsque vous regardez l'application via le concepteur VS, tout est ok et je vois l'image. Cependant, lorsque je lance l'application, aucune image n'est affichée. Je vois que l'image est copiée dans le répertoire out out. Si je mets dans le chemin entier comme la source (C: \ SANDBOX \ WpfApplication1 \ WpfApplication1 \ bin \ Debug ") cela fonctionne

Des idées pour que l'image ne soit pas affichée quand je cours l'application? . a propos de pack URIs mais je pensais que juste référence simplement une image lâche dans le répertoire courant, je peux utiliser le nom de l'image

Merci



Edit:.

L'image à ajouter est dans le dossier: C: \ WPF en C# \ SANDBOX \ WpfApplication1 \ WpfApplication1

Le chemin du fichier image dans VS: C: \ WPF en C# \ SANDBOX \ WpfApplication1 \ WpfApplication1 \ happyface.jpg

I a créé le projet par VS, la définition du répertoire de solution à "C: \ WPF en C# \ Sandbox" et a quitté le projet par défaut et le nom de la solution de WpfApplication1. Je également coché la case "Créer un répertoire pour la solution" donc je maintenant la structure dir suivante:

C: \ WPF en C# \ SANDBOX \ WpfApplication1 - contient le fichier WpfApplication1.sln

C : \ WPF en C# \ SANDBOX \ WpfApplication1 \ WpfApplication1 - contient WpfApplication1.csproj

le jpeg est dans le même répertoire que WpfApplication1.csproj et a été ajouté au projet à partir de là. Lorsque la solution est créée, le répertoire de sortie est C: \ WPF dans C# \ SANDBOX \ WpfApplication1 \ WpfApplication1 \ bin \ Debug et l'image est copiée dans ce répertoire.



Edit # 2

J'ai essayé de déplacer mon application à ma machine 32 bits et tout fonctionne comme prévu. L'image est affichée normalement. Quand je l'ai compilé sur mon x64, j'ai changé la config cible de la plate-forme dans le projet à "x86". Je suis surpris que le problème se produit uniquement lors de l'exécution sur une machine 64 bits (XP 64). Des idées pour lesquelles cela pourrait être le cas?



Edit # 3 - Je pense que je trouve la question

J'activé le suivi de regarder de plus près ce qui se passe. Juste pour m'assurer que je ne faisais rien de fou, j'ai recommencé à zéro, ne changeant rien du projet VS 2008 par défaut qui est créé pour moi en plus d'ajouter l'image comme contenu et de permettre le traçage.

J'ai respecté l'application sur ma machine x64 et l'ai exécutée. Le ci-dessous est ce que j'ai obtenu w.r.t. le contrôle de l'image:

System.Windows.Markup Start: 13 : Set property value; Object='System.Windows.Controls.Image'; Object.HashCode='18796293'; Object.Type='System.Windows.Controls.Image'; PropertyName='Name'; Value='_imageControl' 

System.Windows.Markup Stop: 13 : Set property value; Object='System.Windows.Controls.Image'; Object.HashCode='18796293'; Object.Type='System.Windows.Controls.Image'; PropertyName='Name'; Value='_imageControl' 

System.Windows.RoutedEvent Start: 1 : Raise RoutedEvent; RoutedEvent='Image.ImageFailed'; RoutedEvent.HashCode='12289376'; RoutedEvent.Type='System.Windows.RoutedEvent'; Element='System.Windows.Controls.Image'; Element.HashCode='18796293'; Element.Type='System.Windows.Controls.Image'; RoutedEventArgs='System.Windows.ExceptionRoutedEventArgs'; RoutedEventArgs.HashCode='43495525'; RoutedEventArgs.Type='System.Windows.ExceptionRoutedEventArgs'; Handled='False' 

System.Windows.RoutedEvent Stop: 1 : Raise RoutedEvent; RoutedEvent='Image.ImageFailed'; RoutedEvent.HashCode='12289376'; RoutedEvent.Type='System.Windows.RoutedEvent'; Element='System.Windows.Controls.Image'; Element.HashCode='18796293'; Element.Type='System.Windows.Controls.Image'; RoutedEventArgs='System.Windows.ExceptionRoutedEventArgs'; RoutedEventArgs.HashCode='43495525'; RoutedEventArgs.Type='System.Windows.ExceptionRoutedEventArgs'; Handled='False' 

System.Windows.Markup Start: 16 : Type conversion failed, using fallback; TypeConverter='System.Windows.Media.ImageSourceConverter'; TypeConverter.HashCode='55915408'; TypeConverter.Type='System.Windows.Media.ImageSourceConverter'; String='happyface.jpg'; Value='<null>' 

Comme on le voit, la conversion d'image a échoué parce que la valeur du fichier JPG était en quelque sorte nulle.

J'ai copié l'application directement dans le dossier Desktop de mon ordinateur x86 et je l'ai simplement exécuté. Ici, il a travaillé et nous pouvons voir la différence dans la trace:

System.Windows.Markup Start: 13 : Set property value; Object='System.Windows.Controls.Image'; Object.HashCode='18796293'; Object.Type='System.Windows.Controls.Image'; PropertyName='Name'; Value='_imageControl' 

System.Windows.Markup Stop: 13 : Set property value; Object='System.Windows.Controls.Image'; Object.HashCode='18796293'; Object.Type='System.Windows.Controls.Image'; PropertyName='Name'; Value='_imageControl' 

System.Windows.Markup Start: 15 : Converted value; TypeConverter='System.Windows.Media.ImageSourceConverter'; TypeConverter.HashCode='12289376'; TypeConverter.Type='System.Windows.Media.ImageSourceConverter'; String='happyface.jpg'; Value='pack://application:,,,/ImageContentTest;component/happyface.jpg'; Value.HashCode='43495525'; Value.Type='System.Windows.Media.Imaging.BitmapFrameDecode' 

D'une certaine manière, sur la machine x86, la valeur est correctement réglé sur « pack: // application: ,,,/ImageContentTest; composant/happyface.jpg ';

J'avais l'application sur mon dossier de bureau de x64 de déplacer plus tôt et juste pour des coups de pied courus à partir de là. À ma grande surprise, ça a marché! Il s'avère que le # dans le chemin du dossier était le coupable. Avec le # là, ça ne marchera pas. Avec le # retiré, cela fonctionne normalement. Cela n'a rien à voir avec x64 vs x86.

Je ne suis toujours pas sûr exactement pourquoi le # provoquerait un tel comportement. Je m'attendrais au moins à ce qu'un type d'erreur apparaisse indiquant un mauvais chemin ou quelque chose. En tout cas, je suppose que j'éviterai les # dans les chemins à partir de maintenant :)

Merci à tous ceux qui ont regardé ça avec moi.

+0

Je ne vois pas de problème où il ne se charge pas. Êtes-vous en cours d'exécution sandboxed? y a-t-il quelque chose dans le codebehind? – VoodooChild

+0

Aussi pourquoi est-il appelé "WpfApplication1.Window1"? ne devrait-il pas être VoodooChild

+0

Le code derrière est vide à l'exception de InitializeComponent(). Tout ce que je fais est de créer un nouveau projet à partir de VS, qui utilise par défaut l'espace de noms WpfApplication1 et crée Window1.Les seuls changements que j'ai faits ont été d'ajouter l'image dans le projet en tant que contenu et de modifier le xaml comme ci-dessus. Je l'ai juste exécuté de VS mais l'image n'est pas montrée. – Flack

Répondre

0

Je pense avoir trouvé la question

J'activé le suivi de regarder de plus près ce qui se passe. Juste pour m'assurer que je ne faisais rien de fou, j'ai recommencé à zéro, ne changeant rien du projet VS 2008 par défaut qui est créé pour moi en plus d'ajouter l'image comme contenu et de permettre le traçage.

J'ai respecté l'application sur ma machine x64 et l'ai exécutée. Le ci-dessous est ce que j'ai obtenu w.r.t. le contrôle de l'image:

System.Windows.Markup Start: 13 : Set property value; Object='System.Windows.Controls.Image'; Object.HashCode='18796293'; Object.Type='System.Windows.Controls.Image'; PropertyName='Name'; Value='_imageControl' 

System.Windows.Markup Stop: 13 : Set property value; Object='System.Windows.Controls.Image'; Object.HashCode='18796293'; Object.Type='System.Windows.Controls.Image'; PropertyName='Name'; Value='_imageControl' 

System.Windows.RoutedEvent Start: 1 : Raise RoutedEvent; RoutedEvent='Image.ImageFailed'; RoutedEvent.HashCode='12289376'; RoutedEvent.Type='System.Windows.RoutedEvent'; Element='System.Windows.Controls.Image'; Element.HashCode='18796293'; Element.Type='System.Windows.Controls.Image'; RoutedEventArgs='System.Windows.ExceptionRoutedEventArgs'; RoutedEventArgs.HashCode='43495525'; RoutedEventArgs.Type='System.Windows.ExceptionRoutedEventArgs'; Handled='False' 

System.Windows.RoutedEvent Stop: 1 : Raise RoutedEvent; RoutedEvent='Image.ImageFailed'; RoutedEvent.HashCode='12289376'; RoutedEvent.Type='System.Windows.RoutedEvent'; Element='System.Windows.Controls.Image'; Element.HashCode='18796293'; Element.Type='System.Windows.Controls.Image'; RoutedEventArgs='System.Windows.ExceptionRoutedEventArgs'; RoutedEventArgs.HashCode='43495525'; RoutedEventArgs.Type='System.Windows.ExceptionRoutedEventArgs'; Handled='False' 

System.Windows.Markup Start: 16 : Type conversion failed, using fallback; TypeConverter='System.Windows.Media.ImageSourceConverter'; TypeConverter.HashCode='55915408'; TypeConverter.Type='System.Windows.Media.ImageSourceConverter'; String='happyface.jpg'; Value='<null>' 

Comme on le voit, la conversion d'image a échoué parce que la valeur du fichier JPG était en quelque sorte nulle.

J'ai copié l'application directement dans le dossier Desktop de mon ordinateur x86 et je l'ai simplement exécuté. Ici, il a travaillé et nous pouvons voir la différence dans la trace:

System.Windows.Markup Start: 13 : Set property value; Object='System.Windows.Controls.Image'; Object.HashCode='18796293'; Object.Type='System.Windows.Controls.Image'; PropertyName='Name'; Value='_imageControl' 

System.Windows.Markup Stop: 13 : Set property value; Object='System.Windows.Controls.Image'; Object.HashCode='18796293'; Object.Type='System.Windows.Controls.Image'; PropertyName='Name'; Value='_imageControl' 

System.Windows.Markup Start: 15 : Converted value; TypeConverter='System.Windows.Media.ImageSourceConverter'; TypeConverter.HashCode='12289376'; TypeConverter.Type='System.Windows.Media.ImageSourceConverter'; String='happyface.jpg'; Value='pack://application:,,,/ImageContentTest;component/happyface.jpg'; Value.HashCode='43495525'; Value.Type='System.Windows.Media.Imaging.BitmapFrameDecode' 

D'une certaine manière, sur la machine x86, la valeur est correctement réglé sur « pack: // application: ,,,/ImageContentTest; composant/happyface.jpg ';

J'avais l'application sur mon dossier de bureau de x64 de déplacer plus tôt et juste pour des coups de pied courus à partir de là. À ma grande surprise, ça a marché! Il s'avère que le # dans le chemin du dossier était le coupable. Avec le # là, ça ne marchera pas. Avec le # retiré, cela fonctionne normalement. Cela n'a rien à voir avec x64 vs x86.

Je ne suis toujours pas sûr exactement pourquoi le # provoquerait un tel comportement. Je m'attendrais au moins à ce qu'un type d'erreur apparaisse indiquant un mauvais chemin ou quelque chose. Dans tous les cas, je suppose que je vais éviterons # 's dans les chemins à partir de maintenant :)

Merci à tous ceux qui ont examiné ce avec

0

Ne vous inquiétez pas de la copie, mais définissez son action de construction sur Ressource. Vous devez définir l'URI sur l'image pour qu'elle soit un URI de pack valide. Le concepteur devrait vous aider à le faire, mais si elle ne devrait être dans ce format:

/[nom de l'assemblage]; [chemin au sein du projet] composante

Pour exemple: /MonAssemblyName; component/Resources/image.png

où l'assembly est "MyAssemblyName.dll" et l'image se trouve dans le répertoire Resources de la solution.

+0

Merci. Mais si je souhaite que l'image soit un fichier de contenu libre au lieu d'une ressource, comment puis-je y parvenir? – Flack

0

pourriez-vous vous assurer de deux choses s'il vous plaît?

l'image à ajouter est dans le dossier "[DIR LOCATION] \ Projects \ WpfApplication1 \ Window1" et le chemin du fichier d'image dans VS est « [DIR LOCATION] \ Projects \ WpfApplication1 \ Window1 \ happyface .jpg

remplacer [EMPLACEMENT DIR] avec l'emplacement correct.

+0

Bien sûr. J'ai modifié mon message original pour inclure des informations supplémentaires (cela ne rentre pas dans les commentaires). – Flack

0

J'ai créé une solution comme vous l'avez décrit, et je n'ai eu aucun problème à exécuter la solution dans VS ou à exécuter le fichier * .exe. Un changement que vous pourriez faire pour essayer de vous diriger dans la bonne direction est d'ajouter une instruction Debug pour voir où le contrôle de l'image pense que le fichier image est.

Je l'ai fait en faisant les modifications suivantes dans le fichier * .xaml:

 <Image x:Name="displayImage" Source="have_the_dumb.jpg" /> 

Puis, dans le fichier * .xaml.cs, j'ai ajouté une nouvelle TraceListener pour voir ce que la version autonome * .exe dit. Mon constructeur ressemble à ceci:

public ImageDisplay() 
    { 
     Trace.Listeners.Add(new TextWriterTraceListener(@"c:\happyface.trace.log")); 
     Trace.AutoFlush = true; 

     InitializeComponent(); 

     Trace.WriteLine(String.Format("Image thinks it's in {0}", displayImage.Source.ToString())); 
    } 

Vous devrez peut-être ajouter "using System.Diagnostics" pour que cela fonctionne. Ensuite, exécutez votre solution & voir ce que le fichier de trace contient. Au moins, vous saurez si le contrôle recherche au bon endroit pour l'image.

+0

Merci pour le conseil. J'ai essayé ce que vous avez dit et il s'avère que l'image Source est nulle. Cela explique pourquoi rien n'est affiché mais je ne sais pas pourquoi c'est nul ou comment le réparer. – Flack

+0

Que se passe-t-il si vous modifiez le chemin d'accès à l'image pour suivre la syntaxe URI du pack complet? "pack: // demande:",/happyface.jpg "? –

+0

résultats dans la même erreur (Source == null) Seul le travail ci-dessous fonctionne comme prévu : Dans votre application de travail, vous avez le jeu d'action de construction de l'image au "contenu" droit? – Flack