c# wpf图片 该组件没有uri标识的资源




wpf图片 (13)

重命名xaml文件后出现此错误。 反转重命名解决了问题。

此外,我发现App.xaml中对xaml文件名的引用没有更新(StartupUri),但是将其重命名为当前名称并没有解决问题(但也许它可以帮到你)。 基本上,我无法重命名xaml文件。

Fyi,对我来说,错误中的组件'抱怨'是SplitComboBox。

我想创建一个Generic DataGrid,用于我的所有Views / UserControls。

这是我的结构:

Class Library名为"Core"

名为"ViewBase"

public class ViewBase : UserControl
{
    public ViewBase()
    {
    }   

    //Rest of Methods and Properties
}

名为"Controls" Class Library

UserControl称为"GridView"

XAML:

    <vb:ViewBase x:Class="Controls.GridView"
             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:vb="clr-namespace:Core;assembly=Core">

    <Grid>
        <DataGrid></DataGrid>
    </Grid>

    </vb:ViewBase>

代码背后:

using Core;

public partial class GridView : ViewBase
{
    public GridView ()
    {
        InitializeComponent();
    }
}

然后是名为“WPFApp”的WPF应用程序:

名为"View"

using Controls;

public class View : GridView
{
    public View()
    {
        InitializeComponent();
    }
}

我的整个想法是使用GridView ,我需要一个DataGrid

当我运行应用程序时,我收到此错误:

"The component 'WpfApp.View' does not have a resource identified by the URI '/Controls;component/GridView.xaml'."

我究竟做错了什么?

这是正确的做法还是我离开了?


我在使用Visual Studio 2013时收到了同样的错误。

该组件没有uri标识的资源

尝试:
清理和重建解决方案 - 没有用。
关闭并打开Visual Studio - 无法正常工作。

解:
进入项目bin目录并清除所有文件。
再次跑完项目,工作得很好。

打开将在解决方案的根目录中打开的程序包管理器控制台 ,并运行以下powershell命令:

Get-ChildItem -inc bin,obj -recurse | Remove-Item -recurse -force -EA SilentlyContinue

@Willem,这对我来说似乎完全没问题。 事实上我试过这个,它在我的情况下起作用。 我使用ListBox而不是DataGrid (但这不重要)。

我的所有命名空间都在一个程序集中。 所以我使用了一个共同的父命名空间

MyWpfApplication.Controls MyWpfApplciation.GridView MyWpfApplciation.ViewBase

因为所有这些ControlsGridViewViewBase都与基于现有SystemSystem.Windows.Controls的命名空间和类声明冲突。 所以我确保在我的项目中引用了正确的MyWpfApplication.*


当我在两个解决方案中打开相同的项目时,我很高兴。 在一个项目中修改基本控件会导致另一个项目出现此问题。 如果关闭和打开不起作用,则删除“C:\ Users ... \ AppData \ Local \ Microsoft \ VisualStudio \ 12.0 \ Designer \ ShadowCache”中的所有文件夹


关闭和重新打开窗口时也会发生这种情况。 所以它也可能与包和/或dll无关。
由于PainElemental发布的解决方案,我解决了这个问题,这是恕我直言的被低估:

namespace MyNamespace
{
  public partial class MyDialog : Window
  {
    public MyDialog(ExcelReference sheetReference)
      {
        this.LoadViewFromUri("/MyApp;component/mynamespace/mydialog.xaml");
      }
  }
}

正如PainElemental所写,LoadViewFromUri是作为扩展实现的。 最疯狂的是,我也在同一个项目中编写了其他窗口而没有遇到任何问题。
谢谢PainElemental,你结束了我的长期痛苦!


我做了一些非常相似但结果相同的事情。 我有一个C#类库,其中包含一个名为UsageControl的WPF控件(带有xaml.cs文件的xaml)。 在一个单独的C#项目(即单独的dll)中,我创建了一个继承自UsageControl的C# CPUUsageControl,但是在它上面放了自己的旋转。 当我尝试在我的一个视图上使用CpuUsageControl时,我遇到了同样的错误。

我做了什么来解决这个问题是在我的单独程序集中,而不是创建一个继承自基本控件的类,我创建了一个包含基本控件的新WPF控件。 然后,我将CpuUsage类中包含的所有逻辑放入WpfCpuUsageControl的代码中。 我能够使用这个对象是我的所有其他控件就好了。

对于你的Control“GridView”,我会创建一个新的WPF用户控件 ,称之为GridView并使其包含一个“ViewBase”作为Grid控件的内容。在ViewBase的内容中放入你的DataGrid,如下所示:

<UserControl....>
    <Grid>
        <ViewBase name="vBase">
            <DataGrid name="dGrid" />
        </ViewBase>
    </Grid>
</UserControl>

我也不清楚你需要ViewBase直接从UserControl继承。 如果你想要的只是你的控件具有某些属性和方法,为什么不只是创建一个BaseControl类(除了对象之外不从任何人继承)并让未来的控件继承它。 也许你正在追求一个抽象的基类或接口。

对于MVVM WPF项目,我通常有一个BaseViewModel为我实现了INotifyPropertyChanged,所以我不必在任何地方都使用相同的代码。

祝你好运,我知道这个问题是一个巨大的痛苦。 异常消息和谷歌是最无益的!


这让我头疼了3天! 我在类库中有一个XAML UserControl,在我的.exe项目中有一个来自UserControl的类(只有C#)。 在我的MainWindow.xaml的xaml设计器中,当启动应用程序时,我收到错误“组件没有由uri识别的资源”。 “JuanCarlosGirón”的答案终于引出了我的解决方案:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;
using System.Reflection;
using System.IO.Packaging;
using System.Windows.Markup;

namespace ClassLibrary1
{
    static class Extension
    {
        public static void LoadViewFromUri(this UserControl userControl, string baseUri)
        {
            try
            {
                var resourceLocater = new Uri(baseUri, UriKind.Relative);
                var exprCa = (PackagePart)typeof(Application).GetMethod("GetResourceOrContentPart", BindingFlags.NonPublic | BindingFlags.Static).Invoke(null, new object[] { resourceLocater });
                var stream = exprCa.GetStream();
                var uri = new Uri((Uri)typeof(BaseUriHelper).GetProperty("PackAppBaseUri", BindingFlags.Static | BindingFlags.NonPublic).GetValue(null, null), resourceLocater);
                var parserContext = new ParserContext
                {
                    BaseUri = uri
                };
                typeof(XamlReader).GetMethod("LoadBaml", BindingFlags.NonPublic | BindingFlags.Static).Invoke(null, new object[] { stream, parserContext, userControl, true });
            }
            catch (Exception)
            {
                //log
            }
        }
    }
}

并通过UserControl的.cs文件调用它:

namespace ClassLibrary1
{
    public partial class MyUserControl : UserControl
    {
        public MyUserControl()
        {
            //InitializeComponent();
            this.LoadViewFromUri("/ClassLibrary1;component/myusercontrol.xaml");
        }
    }
}

再次感谢“JuanCarlosGirón”!


你可以尝试这种方法

我创建了自己的InitializeComponent() ,我这样调用

this.LoadViewFromUri("/NameOfProject;component/mainwindow.xaml");


public static void LoadViewFromUri(this Window window, string baseUri)
    {
        try
        {
            var resourceLocater = new Uri(baseUri, UriKind.Relative);
            var exprCa = (PackagePart)typeof(Application).GetMethod("GetResourceOrContentPart", BindingFlags.NonPublic | BindingFlags.Static).Invoke(null, new object[] { resourceLocater });
            var stream = exprCa.GetStream();
            var uri = new Uri((Uri)typeof(BaseUriHelper).GetProperty("PackAppBaseUri", BindingFlags.Static | BindingFlags.NonPublic).GetValue(null, null), resourceLocater);
            var parserContext = new ParserContext
            {
                BaseUri = uri
            };
            typeof(XamlReader).GetMethod("LoadBaml", BindingFlags.NonPublic | BindingFlags.Static).Invoke(null, new object[] { stream, parserContext, window, true });

        }
        catch (Exception)
        {
            //log
        }
    }

  • 删除obj文件夹
  • 删除bin文件夹
  • 重建解决方案

为我工作!

此外,如果使用Assembly.LoadFile加载程序集,请检查当前AppDomain中重复程序集的AppDomain.CurrentDomain.GetAssemblies() 。 因为在自动生成的WPF UserControl代码中,组件将使用其相对URI加载。 由于当前AppDomain中存在重复的程序集,因此应用程序不知道要使用哪个程序集。


同样的问题在这里

简洁版本:

复制本地必须设置为False

长版:

我们开发了WPF解决方案(MVVM,20个项目)并实现了插件系统。 我们的/ bin / Debug目录包含可执行文件,一些dll文件和包含插件的插件目录。 有一个项目“DialogLib”(类库,一种对话框)定义了一个窗口(视图),ViewModel,Model和一些接口。 其中一个插件使用了DialogLib的一个接口。 窗口本身由主应用程序打开。

要在插件中使用'DialogLib'库的接口,我们必须将DialogLib的项目引用添加到插件项目引用中。 应用程序启动时,插件已加载。 如果用户然后选择菜单项,则窗口应该打开。 此时,当后面的Windows代码尝试执行其InitializeComponent()时,出现错误“...组件没有由URI标识的资源...”。

问题出在哪里?

问题是,当我们构建解决方案时,VS已正确创建了DialogLib.dll并将其复制到/ bin / Debug /。 这是因为主应用程序文件想要打开窗口。 但是DialogLib.dll也被复制到/ bin / Debug / plugins,因为其中一个插件引用它来使用DialogLib.dll中定义的接口之一。 所以呢?

在运行时加载插件时,它使用/bin/Debug/plugins/DialogLib.dll中定义的接口。 并且主应用程序文件尝试打开/bin/Debug/DialogLib.dll中定义的窗口。 尽管文件完全相同,但VS遇到了麻烦。 设置插件引用的DialogLib引用属性的Copy Local值可以避免将DialogLib.dll复制到/ bin / Debug / plugins,从而解决了这个问题。

我们在另一个项目中遇到了类似的问题(但是有不同的错误),我们想要使用类型TypeA ,它在dll文件,插件和主应用程序中定义。 Copy Local设置为true ,导致dll文件的副本位于../bin/Debug/plugins../bin/Debug/中 。 事实证明,即使它是相同的dll文件,主app文件中的TypeA和插件中的TypeA也分别被视为不能交换的类型。


令人沮丧的是,我确实遇到了这个错误并且花了很多时间试图找出原因。 对我来说,它曾经工作,但后来我对派生控件的XAML做了一些非常小的改动,编译器开始给出错误信息。 简短的解决方案,削减了许多小时试图找出它:关闭Visual Studio并重新打开它,重新编译,问题神奇地消失了! (这是VS2012专业版)只是添加了这个以防万一阅读是围绕圈子试图找到他们的代码不存在的问题。 可能值得首先尝试“IT群体解决方案”。


我也遇到了这个问题,没有任何继承问题。 我只是引用了一个包含对话框并试图创建和显示该对话框的DLL。 我有程序集解析器从特定文件夹加载程序集,结果是我在VS中添加了引用并且没有关闭Copy Local。 长话短说:我的进程加载了同一个DLL的两个版本。 这似乎混淆了WPF(或运行时)。 一旦我清除了复制本地并删除了额外的DLL副本,它再次正常工作。


您收到此错误的原因是因为实现的InitializeComponent(在VS 2010中)将始终在派生类的程序集中进行搜索。

这是InitializeComponent:

/// <summary>
/// InitializeComponent
/// </summary>
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
public void InitializeComponent() {
    if (_contentLoaded) {
        return;
    }
    _contentLoaded = true;
    System.Uri resourceLocater = new System.Uri("/WpfApplication1;component/mainwindow.xaml", System.UriKind.Relative);

    #line 1 "..\..\..\MainWindow.xaml"
    System.Windows.Application.LoadComponent(this, resourceLocater);

    #line default
    #line hidden
}

它查找XAML资源的行是System.Windows.Application.LoadComponent(this,resourceLocator)。 这很可能失败,因为相当于'this.GetType()。Assembly'用于确定搜索相对Uri标识的资源的程序集。 并且'this.GetType()'确实获得了对象的派生类型,而不是实现代码的类的类型。

PS。 这是一个错误吗? 我不知道...





mvvm