VS 2012:无法从文本中创建“ImageSource”

时间:2012-11-15 14:14:30

标签: wpf visual-studio-2012 runtime-error imagesource

我在资源字典中声明了一个图像,然后在用户控件中显示如下:

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中的一个文件中?

2 个答案:

答案 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中执行的。