我在资源字典中声明了一个图像,然后在用户控件中显示如下:
ResourceDictionary.xaml (我在这里使用一种风格,因为我计划在用户更改他们看到的内容时更新图像,即公司,员工等)。
<ImageSource x:Key="CompanyIcon">Images/company_128.png</ImageSource>
<Style x:Key="QuickInfoIcon" TargetType="{x:Type Image}">
<!-- Default Value -->
<Setter Property="Source" Value="{StaticResource CompanyIcon}" />
</Style>
'Images'文件夹是'Assests'的子目录。 'Assests'文件夹包含我的'ResourceDictionary.xaml'文件,我知道路径是正确的,因为如果我将路径更改为'../ Images / company_128.png'
,我会收到设计器错误QuickinfoView.xaml
<UserControl x:Class="SidekickAdmin.Views.QuickInfoView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d" d:DesignWidth="500" Height="100"
Background="BlanchedAlmond">
<!-- Setup a grid to house the icon and the info -->
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid Grid.Column="0" Name="InfoIcon">
<Image Style="{StaticResource QuickInfoIcon}" Height="50" Width="50"/>
</Grid>
</Grid>
</UserControl>
在Visual Studio 2012设计器中查看布局时,一切都正确显示但是当我运行程序时出现“XamlParseException发生错误:无法从文本'Images / employee_128.png'创建'ImageSource'。”在ImageSource的ResourceDictionary行上。
如果我更改ImageSource以使用其他图像,它会在VS2012设计器中按预期更新,但在尝试运行程序时会出现相同的错误。
我已在Resource.resx文件中将Build Action设置为'Embedded Resource',但这并没有解决问题。
当我尝试运行这个程序时,有没有想过我为什么会得到XamlParseException?
作为一个附带问题,当我在我的程序中合并图像时,图像本身(文件)应该在bin / debug文件夹中的哪个位置可见,或者这个信息是否隐藏在bin / debug中的一个文件中?
答案 0 :(得分:2)
我遇到了同样的问题。
您可以尝试修复我的问题。
在解决方案资源管理器中将文件添加到项目中。 我建议在文件的相对路径上依赖于项目文件来添加文件夹。 然后转到:
BUILD - &gt;清洁解决方案
完成。
答案 1 :(得分:1)
我也和这个问题发生了冲突。这个或任何社区提供的建议都没有,其中大部分都是关于PACK uri和其他方法的逐字陈述解决了这个问题。可悲的是,尽管人们在回答时表现出的热情,但他们中的大多数人并不知道如何解决这个问题。
设置:1个解决方案,2个项目。
项目1是一个包含资源字典的类库,其中包含BitMapSource条目列表,这些条目指向下面包含的图像的本地相对路径。
示例:
<BitmapSource x:Key="RedoImage">Images/Redo.png</BitmapSource>
Project 2是一个WPF应用程序,它引用了该类库,并使用MergedDictionary从其他程序集加载字典:
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/WPFResourceLibrary;component/Resources/images.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
在WPF应用程序项目的表单中,我在表单上删除了一个简单的IMAGE控件。在它的源属性下,我可以从LocalResources中选择我的images.xaml资源字典中的BitMapSources列表(按键)。进行选择后,图像将出现(如预期的那样)。
但是,在运行应用程序时,我会得到可怕的“无法从文本中创建图像源...”消息。我想要尝试所有的建议,但都没有成功。在运行时始终是相同的错误,或者没有错误,但没有图像。
美联储,我制作了自己的自定义控件。我选择不覆盖图像源属性,因此我们可以在适当的地方使用它,但通过添加名为ResourceName的依赖项属性来扩展它。此控件查看当前应用程序域中记录和可用的所有BitMapSource和ImageSource。宾果,它的工作原理。
代码:
<Image x:Class="WPFResourceLibrary.Controls.ImageFromResource"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
>
</Image>
以及它背后的守则。
using System;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Imaging;
namespace WPFResourceLibrary.Controls
{
/// <summary>
/// ImageFromResource - an extension of the standard Image control that properly handles binding Resource to an Image from a Resource
/// </summary>
public partial class ImageFromResource : Image
{
public ImageFromResource()
{
InitializeComponent();
DependencyPropertyDescriptor imageDescriptor = DependencyPropertyDescriptor.FromProperty(ImageFromResource.ResourceNameProperty, typeof(ImageFromResource));
if (imageDescriptor != null)
{
imageDescriptor.AddValueChanged(this, delegate { SetImage(); });
}
}
public static DependencyProperty ResourceNameProperty = DependencyProperty.Register("ResourceName", typeof(ImageSource), typeof(ImageFromResource), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
[Description("Resource String of the Target Image."), Category("Appearance")]
public ImageSource ResourceName
{
get { return (ImageSource)GetValue(ResourceNameProperty); }
set
{
SetValue(ResourceNameProperty, value);
}
}
private void SetImage()
{
if(ResourceName != null)
this.Source = new BitmapImage(new Uri(ResourceName.ToString()));
}
}
}
因此,提供标准图像所需的功能,而不会出现问题。
请注意,这是在带有SP3的Visual Studio 2012中执行的。
保