У меня ниже простой 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 включен в проект, и его действие по сборке установлено в «Содержимое», а в «Копировать в Ouptput Directory» установлено «Копировать всегда».
При просмотре приложения через конструктор VS все в порядке, и я вижу изображение. Однако, когда я запускаю приложение, изображение не отображается. Я вижу, что изображение копируется в выходной каталог. Если в качестве источника указать полный путь (C: \ SANDBOX \ WpfApplication1 \ WpfApplication1 \ bin \ Debug "), он будет работать.
Есть идеи, почему изображение не отображается при запуске приложения? Я читал об URI пакетов, но подумал, что просто для ссылки на свободное изображение в текущем каталоге я могу просто использовать имя изображения.
Спасибо.
Edit:
Изображение для добавления находится в папке:
C: \ WPF в C # \ SANDBOX \ WpfApplication1 \ WpfApplication1
Путь к файлу изображения в VS:
C: \ WPF в C # \ SANDBOX \ WpfApplication1 \ WpfApplication1 \ happyface.jpg
Я создал проект через VS, установив каталог решения в
"C: \ WPF в C # \ SANDBOX" и оставил проект по умолчанию и имя решения WpfApplication1.
Я также установил флажок «Создать каталог для решения», поэтому теперь у меня есть следующая структура каталогов:
C: \ WPF в C # \ SANDBOX \ WpfApplication1 - содержит файл WpfApplication1.sln
C: \ WPF в C # \ SANDBOX \ WpfApplication1 \ WpfApplication1 - содержит 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 было каким-то образом нулевым.
Я скопировал приложение прямо в папку Desktop на моем компьютере с архитектурой 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.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 значение корректно установлено в 'pack: // application: ,,, / ImageContentTest; component / happyface.jpg';
У меня было приложение в папке x64 Desktop, которое я переместил ранее, и просто ради удовольствия запустил его оттуда. К моему удивлению, это сработало! Оказывается, виновником был # в пути к папке. С # там это не будет работать. С удаленным # он работает нормально. Это не имеет ничего общего с x64 против x86.
Я все еще не совсем уверен, почему # вызывает такое поведение. Я бы по крайней мере ожидал, что будет выдан какой-то тип ошибки, указывающий на неправильный путь или что-то в этом роде В любом случае, я думаю, что теперь я буду избегать # в путях:)
Спасибо всем, кто смотрел на это со мной.