C# 在使用XamlReder.Load加载XAML代码后,如何从中获取引用对象?
我希望使用XAML代码将对象结构与XamlWriter序列化,并且有可能再次使用XamlReader将XAML代码加载回对象结构中。输出XAML代码应可读,以便用户可以编辑(或编写新代码),并应如下所示:C# 在使用XamlReder.Load加载XAML代码后,如何从中获取引用对象?,c#,wpf,xaml,C#,Wpf,Xaml,我希望使用XAML代码将对象结构与XamlWriter序列化,并且有可能再次使用XamlReader将XAML代码加载回对象结构中。输出XAML代码应可读,以便用户可以编辑(或编写新代码),并应如下所示: <?xml version="1.0" encoding="utf-8" ?> <MainClass> <Class2 Name="Calss2Name"> <Class3 Name="Class3Name">
<?xml version="1.0" encoding="utf-8" ?>
<MainClass>
<Class2 Name="Calss2Name">
<Class3 Name="Class3Name">
</Class3>
</Class2>
<!-- Where Class2Name is reference to Class2 tag and after loading into Object structure Class1 schould have a reference set to Class2-->
<Class1 Class2Property="Calss2Name" />
</MainClass>
public class MainClass
{
public MainClass()
{
_class2ListProperty = new List<Class2>();
_class1ListProperty = new List<Class1>();
}
private List<Class2> _class2ListProperty = new List<Class2>();
private List<Class1> _class1ListProperty = new List<Class1>();
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public List<Class2> Class2ListProperty
{
get
{
return _class2ListProperty;
}
}
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public List<Class1> Class1ListProperty
{
get
{
return _class1ListProperty;
}
}
}
public class Class1
{
private Class2 _class2Member;
public String Name { get; set; }
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
public Class2 Class2Property
{
get
{
return _class2Member;
}
set
{
this._class2Member = value;
}
}
}
public class Class2
{
public Class2()
{
_class3ListMember = new List<Class3>();
}
private List<Class3> _class3ListMember = new List<Class3>();
public String Name { get; set; }
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public List<Class3> Class3ListProperty
{
get
{
return _class3ListMember;
}
}
}
public class Class3
{
public Class3()
{
_class3ListMember = new List<Class3>();
}
public String Name { get; set; }
[TypeConverter(typeof(Int32RangeConverter))]
public Int32Range Runtime { get; set; }
private List<Class3> _class3ListMember = new List<Class3>();
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public List<Class3> Class3ListProperty
{
get
{
return _class3ListMember;
}
}
}
<?xml version="1.0" encoding="utf-8" ?>
<MainClass>
<Class2 Name="Calss2Name">
<Class3 Name="Class3Name">
</Class3>
</Class2>
<!-- Where Class2Name is reference to Class2 tag and after loading into Object structure Class1 schould have a reference set to Class2-->
<Class1 Class2Property="{Class2MarkupExtension class2Name=Calss2Name}" />
</MainClass>
类结构应该如下所示:
<?xml version="1.0" encoding="utf-8" ?>
<MainClass>
<Class2 Name="Calss2Name">
<Class3 Name="Class3Name">
</Class3>
</Class2>
<!-- Where Class2Name is reference to Class2 tag and after loading into Object structure Class1 schould have a reference set to Class2-->
<Class1 Class2Property="Calss2Name" />
</MainClass>
public class MainClass
{
public MainClass()
{
_class2ListProperty = new List<Class2>();
_class1ListProperty = new List<Class1>();
}
private List<Class2> _class2ListProperty = new List<Class2>();
private List<Class1> _class1ListProperty = new List<Class1>();
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public List<Class2> Class2ListProperty
{
get
{
return _class2ListProperty;
}
}
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public List<Class1> Class1ListProperty
{
get
{
return _class1ListProperty;
}
}
}
public class Class1
{
private Class2 _class2Member;
public String Name { get; set; }
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
public Class2 Class2Property
{
get
{
return _class2Member;
}
set
{
this._class2Member = value;
}
}
}
public class Class2
{
public Class2()
{
_class3ListMember = new List<Class3>();
}
private List<Class3> _class3ListMember = new List<Class3>();
public String Name { get; set; }
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public List<Class3> Class3ListProperty
{
get
{
return _class3ListMember;
}
}
}
public class Class3
{
public Class3()
{
_class3ListMember = new List<Class3>();
}
public String Name { get; set; }
[TypeConverter(typeof(Int32RangeConverter))]
public Int32Range Runtime { get; set; }
private List<Class3> _class3ListMember = new List<Class3>();
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public List<Class3> Class3ListProperty
{
get
{
return _class3ListMember;
}
}
}
<?xml version="1.0" encoding="utf-8" ?>
<MainClass>
<Class2 Name="Calss2Name">
<Class3 Name="Class3Name">
</Class3>
</Class2>
<!-- Where Class2Name is reference to Class2 tag and after loading into Object structure Class1 schould have a reference set to Class2-->
<Class1 Class2Property="{Class2MarkupExtension class2Name=Calss2Name}" />
</MainClass>
public类MainClass
{
公共类()
{
_class2ListProperty=新列表();
_ClassListProperty=新列表();
}
私有列表_class2ListProperty=新列表();
私有列表_ClassListProperty=新列表();
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
公共列表Class2ListProperty
{
得到
{
返回_class2ListProperty;
}
}
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
公共列表属性
{
得到
{
返回(u)属性;;
}
}
}
公共班级1
{
私人2类_2类成员;
公共字符串名称{get;set;}
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
公共类别2类别2属性
{
得到
{
返回_class2成员;
}
设置
{
这是。_class2成员=值;
}
}
}
公共课2
{
公共类别2()
{
_class3ListMember=新列表();
}
私有列表_class3ListMember=新列表();
公共字符串名称{get;set;}
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
公共列表Class3ListProperty
{
得到
{
返回_class3ListMember;
}
}
}
公共班级3
{
公共类别3()
{
_class3ListMember=新列表();
}
公共字符串名称{get;set;}
[TypeConverter(typeof(Int32RangeConverter))]
公共Int32Range运行时{get;set;}
私有列表_class3ListMember=新列表();
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
公共列表Class3ListProperty
{
得到
{
返回_class3ListMember;
}
}
}
是否有可能为XAML文件和类构建这样的结构,而不将整个Class2节点再次放在Class1树中?如果是,我将感谢您的建议
提前谢谢。我已经成功了!使用MarkupExtension,我可以将属性引用到对应的IG对象。因此,Xaml代码应该如下所示:
<?xml version="1.0" encoding="utf-8" ?>
<MainClass>
<Class2 Name="Calss2Name">
<Class3 Name="Class3Name">
</Class3>
</Class2>
<!-- Where Class2Name is reference to Class2 tag and after loading into Object structure Class1 schould have a reference set to Class2-->
<Class1 Class2Property="Calss2Name" />
</MainClass>
public class MainClass
{
public MainClass()
{
_class2ListProperty = new List<Class2>();
_class1ListProperty = new List<Class1>();
}
private List<Class2> _class2ListProperty = new List<Class2>();
private List<Class1> _class1ListProperty = new List<Class1>();
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public List<Class2> Class2ListProperty
{
get
{
return _class2ListProperty;
}
}
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public List<Class1> Class1ListProperty
{
get
{
return _class1ListProperty;
}
}
}
public class Class1
{
private Class2 _class2Member;
public String Name { get; set; }
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
public Class2 Class2Property
{
get
{
return _class2Member;
}
set
{
this._class2Member = value;
}
}
}
public class Class2
{
public Class2()
{
_class3ListMember = new List<Class3>();
}
private List<Class3> _class3ListMember = new List<Class3>();
public String Name { get; set; }
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public List<Class3> Class3ListProperty
{
get
{
return _class3ListMember;
}
}
}
public class Class3
{
public Class3()
{
_class3ListMember = new List<Class3>();
}
public String Name { get; set; }
[TypeConverter(typeof(Int32RangeConverter))]
public Int32Range Runtime { get; set; }
private List<Class3> _class3ListMember = new List<Class3>();
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public List<Class3> Class3ListProperty
{
get
{
return _class3ListMember;
}
}
}
<?xml version="1.0" encoding="utf-8" ?>
<MainClass>
<Class2 Name="Calss2Name">
<Class3 Name="Class3Name">
</Class3>
</Class2>
<!-- Where Class2Name is reference to Class2 tag and after loading into Object structure Class1 schould have a reference set to Class2-->
<Class1 Class2Property="{Class2MarkupExtension class2Name=Calss2Name}" />
</MainClass>
此外,我还创建了LoadMainClass方法,该方法将Xaml转换为对象结构:
public class MainClassFactory
{
/// <summary>
/// Returns MainClass Object from Xaml Code.
/// </summary>
public static MainClass LoadMainClass(String xamlAsString)
{
StringReader stringReader = new StringReader(xamlAsString.ToString());
XmlReader xmlReader = XmlReader.Create(stringReader);
object outputMainClass = XamlReader.Load(xmlReader);
return outputMainClass as MainClass;
}
}
兄弟,不要用XAML来做这个提议!我试着做这样的事,但后来遇到了很多麻烦。使用xml或json!什么样的麻烦?你要找的是序列化。看看这里:例如:1。Xaml阅读器不能容忍更改。因此,在类中添加/删除字段是个问题。2.Xaml阅读器产生了不清楚的错误消息。因此,在文件中查找错误是问题所在。Xaml阅读器很难扩展。因此,如果需要,结构迁移——例如,删除一个字段,但在前面的值的基础上添加另一个字段——就是问题所在