我有以下简单的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.图像控制: 正如我们所看到的,图像转换失败了,因为jpg的值在某种程度上是空的。 我将应用程序直接复制到x86机器的Desktop文件夹中,然后运行它。这里有效,我们可以看到跟踪的差异: 不知何故,在x86机器上,Value被正确设置为'pack:// application:,,, / ImageContentTest; component / happyface.jpg'; 我的x64桌面文件夹上的应用程序之前移动它只是为了踢它从那里运行它。令我惊讶的是,它奏效了! 事实证明文件夹路径中的#是罪魁祸首。 #在那里,它将无法正常工作。删除#后,它可以正常工作。它与x64 vs x86无关。 我仍然不确定为什么#会导致这种行为。我至少会期望抛出某种类型的错误,表明路径不好或什么的。在任何情况下,我想从现在开始我将避开#的路径:) 感谢所有与我一起调查此事的人。
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>'
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'
答案 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无关。
我仍然不确定为什么#会导致这种行为。我至少会期望抛出某种类型的错误,表明路径不好或什么的。在任何情况下,我想从现在开始我将避开#的路径:)
感谢所有使用
进行调查的人