C# 如何在不创建外部对象的情况下加载xaml文件?

C# 如何在不创建外部对象的情况下加载xaml文件?,c#,wpf,C#,Wpf,是否可以从磁盘(即不是从应用程序资源)加载xaml文件并在不创建外部对象的情况下创建对象树?换句话说,我想创建一个从窗口派生并从磁盘加载xaml文件的类。似乎我可以创建一个不是从窗口派生的类,可以从磁盘加载,或者我可以创建一个从窗口派生的类,但可以从应用程序资源加载xaml 例如,我可以这样做: XmlTextReader xmlReader = new XmlTextReader("c:\\mywindow.xaml"); object obj = XamlReader.Load(xmlRea

是否可以从磁盘(即不是从应用程序资源)加载xaml文件并在不创建外部对象的情况下创建对象树?换句话说,我想创建一个从窗口派生并从磁盘加载xaml文件的类。似乎我可以创建一个不是从窗口派生的类,可以从磁盘加载,或者我可以创建一个从窗口派生的类,但可以从应用程序资源加载xaml

例如,我可以这样做:

XmlTextReader xmlReader = new XmlTextReader("c:\\mywindow.xaml");
object obj = XamlReader.Load(xmlReader);
Window win = obj as Window;
但我真正想做的是:

class MyWindow : Window
{
    public MyWindow()
    {
        System.Uri resourceLocater = new System.Uri("file://c:/mywindow.xaml", UriKind.Absolute);
        System.Windows.Application.LoadComponent(this, resourceLocater);
    }
}
...
MyWindow w = new MyWindow();

当前,第二位代码给出了一个异常,表示uri不能是绝对的。

我不确定是否可以加载具有绝对路径的程序集,该路径指向文件系统中的某个文件

几天前我遇到了一个类似的问题,也许我的帖子可以帮上忙(看看我答案的编辑):




编辑:我刚才看到您想加载xaml,而不是程序集?然后查看System.Windows.Markup.XamlReader,也许这就是您要查找的内容。

我不确定您是否可以加载具有绝对路径的程序集,指向文件系统中的某个文件

几天前我遇到了一个类似的问题,也许我的帖子可以帮上忙(看看我答案的编辑):




编辑:我刚才看到您想加载xaml,而不是程序集?然后查看System.Windows.Markup.XamlReader,也许这就是您要查找的内容。

您可以将XAML文件的内容加载到字符串中,然后解析内容,如下所示:

        try
        {
            string strXaml = String.Empty;
            using (var reader = new System.IO.StreamReader(filePath, true))
            {
                strXaml = reader.ReadToEnd();
            }

            object xamlContent = System.Windows.Markup.XamlReader.Parse(strXaml);
        }
        catch (System.Windows.Markup.XamlParseException ex)
        {
            // You can get specific error information like LineNumber from the exception
        }
        catch (Exception ex)
        {
            // Some other error
        }
然后您应该能够将xamlContent设置为窗口的Content属性

Window w = new Window();
w.content = xamlContent;
w.ShowDialog();

您可以将XAML文件的内容加载到字符串中,然后解析内容,如下所示:

        try
        {
            string strXaml = String.Empty;
            using (var reader = new System.IO.StreamReader(filePath, true))
            {
                strXaml = reader.ReadToEnd();
            }

            object xamlContent = System.Windows.Markup.XamlReader.Parse(strXaml);
        }
        catch (System.Windows.Markup.XamlParseException ex)
        {
            // You can get specific error information like LineNumber from the exception
        }
        catch (Exception ex)
        {
            // Some other error
        }
然后您应该能够将xamlContent设置为窗口的Content属性

Window w = new Window();
w.content = xamlContent;
w.ShowDialog();

多么好的主意,窗口库或组件库正在等待使用-太棒了。多么好的主意,窗口库或组件库正在等待使用-太棒了。