The component does not have a resource identified by the uri

后端 未结 20 983
悲哀的现实
悲哀的现实 2020-12-01 07:33

I want to create a Generic DataGrid to use on all my Views/UserControls.

This is my structure:

Class Library called \"Core\":

20条回答
  •  抹茶落季
    2020-12-01 07:56

    This gave me headaches for 3 days! I have a XAML UserControl in a class library and a class (only C#) that derives from the UserControl in my .exe project. In xaml designer of my MainWindow.xaml and when starting the application, I got the error "component does not have a resource identified by the uri". The answer of "Juan Carlos Girón" finally lead me to the solution:

    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
                }
            }
        }
    }
    

    and called that from by UserControl's .cs file:

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

    Thanks again to "Juan Carlos Girón"!

提交回复
热议问题