C# 如何在不创建外部对象的情况下加载xaml文件?
是否可以从磁盘(即不是从应用程序资源)加载xaml文件并在不创建外部对象的情况下创建对象树?换句话说,我想创建一个从窗口派生并从磁盘加载xaml文件的类。似乎我可以创建一个不是从窗口派生的类,可以从磁盘加载,或者我可以创建一个从窗口派生的类,但可以从应用程序资源加载xaml 例如,我可以这样做:C# 如何在不创建外部对象的情况下加载xaml文件?,c#,wpf,C#,Wpf,是否可以从磁盘(即不是从应用程序资源)加载xaml文件并在不创建外部对象的情况下创建对象树?换句话说,我想创建一个从窗口派生并从磁盘加载xaml文件的类。似乎我可以创建一个不是从窗口派生的类,可以从磁盘加载,或者我可以创建一个从窗口派生的类,但可以从应用程序资源加载xaml 例如,我可以这样做: XmlTextReader xmlReader = new XmlTextReader("c:\\mywindow.xaml"); object obj = XamlReader.Load(xmlRea
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();
多么好的主意,窗口库或组件库正在等待使用-太棒了。多么好的主意,窗口库或组件库正在等待使用-太棒了。