从XAML显示本地图像的问题

时间:2010-05-27 17:18:55

标签: c# wpf

我有以下简单的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包含在项目中,其Build Action设置为“Content”,Copy To Ouptput Directory设置为“Always Always”。

当通过VS设计师查看应用程序时,一切正常,我看到了图像。但是,当我运行应用程序时,不会显示任何图像。我看到图像被复制到out out目录。如果我把整个路径作为源(C:\ SANDBOX \ WpfApplication1 \ WpfApplication1 \ bin \ Debug“),它就可以工作。

关于运行应用程序时图像显示原因的任何想法?我读到了关于包URI的信息,但我认为只是简单地引用当前目录中的松散图像,我可以使用图像名称。

谢谢。



修改

要添加的图像位于文件夹中: C:\ WPF in C#\ SANDBOX \ WpfApplication1 \ WpfApplication1

VS中图像文件的路径: C:\ WPF in C#\ SANDBOX \ WpfApplication1 \ WpfApplication1 \ happyface.jpg

我通过VS创建了项目,将解决方案目录设置为 “C:\ WPF in C#\ SANDBOX”并保留了WpfApplication1的默认项目和解决方案名称。 我还选中了“为解决方案创建目录”框,因此我现在有以下目录结构:

C:\ WPF \ SANDBOX \ WpfApplication1 中的

C:\ SANDBOX \ WpfApplication1 \ WpfApplication1 中的C:\ WPF - 包含WpfApplication1.csproj

jpeg与WpfApplication1.csproj在同一个目录中,并从那里添加到项目中。构建解决方案时,输出目录为 C:\ WPF在C#\ SANDBOX \ WpfApplication1 \ WpfApplication1 \ bin \ Debug 中,图像被复制到该目录。



编辑#2

我尝试将我的应用程序移动到我的32位计算机上,一切都按预期工作。图像正常显示。当我在x64上编译它时,我将项目中的平台目标配置更改为“x86”。我很惊讶这个问题只发生在64位机器(XP 64)上运行时。任何想法为什么会这样?



编辑#3 - 我认为我发现了问题

我启用了跟踪功能,可以仔细查看发生了什么。为了确保我没有做任何疯狂的事情,我从头开始,不改变为我创建的默认VS 2008项目,除了将图像添加为内容并启用跟踪。

我在x64机器上编写了应用程序并运行它。以下是我得到的w.r.t.图像控制:

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

正如我们所看到的,图像转换失败了,因为jpg的值在某种程度上是空的。

我将应用程序直接复制到x86机器的Desktop文件夹中,然后运行它。这里有效,我们可以看到跟踪的差异:

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'

不知何故,在x86机器上,Value被正确设置为'pack:// application:,,, / ImageContentTest; component / happyface.jpg';

我的x64桌面文件夹上的应用程序之前移动它只是为了踢它从那里运行它。令我惊讶的是,它奏效了! 事实证明文件夹路径中的#是罪魁祸首。 #在那里,它将无法正常工作。删除#后,它可以正常工作。它与x64 vs x86无关。

我仍然不确定为什么#会导致这种行为。我至少会期望抛出某种类型的错误,表明路径不好或什么的。在任何情况下,我想从现在开始我将避开#的路径:)

感谢所有与我一起调查此事的人。

4 个答案:

答案 0 :(得分:0)

不要担心复制它,而是将其构建操作设置为Resource。您需要将Image的URI设置为有效的包URI。设计师帮助您执行此操作,但如果不是,则应采用以下格式:

  

/ [程序集名称];组件[项目中的路径]

例如:/ MyAssemblyName; component = Resources / image.png

程序集是“MyAssemblyName.dll”,图像位于解决方案的Resources目录下。

答案 1 :(得分:0)

你可以确定几件事吗?

要添加的图像位于文件夹中 “[DIR LOCATION] \ Projects \ WpfApplication1 \ Window1” 并且VS中的图像文件的路径是 “[DIR LOCATION] \ Projects \ WpfApplication1 \ Window1 \ happyface.jpg

用正确的位置替换[DIR LOCATION]。

答案 2 :(得分:0)

我创建了一个与您描述的解决方案一样的解决方案,我在VS内运行解决方案或运行* .exe时没有任何问题。

您可以尝试指向正确方向的一个更改是添加一个Debug语句,以查看图像控件对图像文件的认可位置。

我是通过在* .xaml文件中进行以下更改来实现的:

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

然后,在* .xaml.cs文件中,我添加了一个新的TraceListener来查看独立* .exe所说的内容。我的构造函数看起来像这样:

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

您可能需要添加“using System.Diagnostics”才能使用。然后,运行您的解决方案&amp;查看跟踪文件包含的内容。至少你会知道控件是否在图像的正确位置。

答案 3 :(得分:0)

我想我发现了这个问题

我启用了跟踪功能,可以仔细查看发生了什么。为了确保我没有做任何疯狂的事情,我从头开始,不改变为我创建的默认VS 2008项目,除了将图像添加为内容并启用跟踪。

我在x64机器上编写了应用程序并运行它。以下是我得到的w.r.t.图像控制:

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

正如我们所看到的,图像转换失败了,因为jpg的值在某种程度上是空的。

我将应用程序直接复制到x86机器的Desktop文件夹中,然后运行它。这里有效,我们可以看到跟踪的差异:

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'

不知何故,在x86机器上,Value被正确设置为'pack:// application:,,, / ImageContentTest; component / happyface.jpg';

我的x64桌面文件夹上的应用程序之前移动它只是为了踢它从那里运行它。令我惊讶的是,它奏效了! 事实证明文件夹路径中的#是罪魁祸首。 #在那里,它将无法正常工作。删除#后,它可以正常工作。它与x64 vs x86无关。

我仍然不确定为什么#会导致这种行为。我至少会期望抛出某种类型的错误,表明路径不好或什么的。在任何情况下,我想从现在开始我将避开#的路径:)

感谢所有使用

进行调查的人