Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在使用XamlReder.Load加载XAML代码后,如何从中获取引用对象?_C#_Wpf_Xaml - Fatal编程技术网

C# 在使用XamlReder.Load加载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">

我希望使用XAML代码将对象结构与XamlWriter序列化,并且有可能再次使用XamlReader将XAML代码加载回对象结构中。输出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> 

类结构应该如下所示:

<?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阅读器很难扩展。因此,如果需要,结构迁移——例如,删除一个字段,但在前面的值的基础上添加另一个字段——就是问题所在