Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.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#序列化UIElementCollection_C#_Xaml_Serialization_Deserialization - Fatal编程技术网

C#序列化UIElementCollection

C#序列化UIElementCollection,c#,xaml,serialization,deserialization,C#,Xaml,Serialization,Deserialization,我有一些代码: public static UIElementCollection DeSerializeXAML(string filename) { // Load XAML from file. Use 'using' so objects are disposed of properly. using (System.IO.FileStream fs = System.IO.File.Open(filename, System.IO.Fil

我有一些代码:

    public static UIElementCollection DeSerializeXAML(string filename)
    {
        // Load XAML from file. Use 'using' so objects are disposed of properly.
        using (System.IO.FileStream fs = System.IO.File.Open(filename, System.IO.FileMode.Open, System.IO.FileAccess.Read))
        {
            return System.Windows.Markup.XamlReader.Load(fs) as UIElementCollection; //EXCEPTION
        }
    }

    // Serializes any UIElement object to XAML using a given filename.
    public static void SerializeToXAML(UIElementCollection elements, string filename)
    {
        // Use XamlWriter object to serialize element
        string strXAML = System.Windows.Markup.XamlWriter.Save(elements);

        // Write XAML to file. Use 'using' so objects are disposed of properly.
        using (System.IO.FileStream fs = System.IO.File.Create(filename))
        {
            using (System.IO.StreamWriter streamwriter = new System.IO.StreamWriter(fs))
            {
                streamwriter.Write(strXAML);
            }
        }
    }

    private void btnSave_Click(object sender, RoutedEventArgs e)
    {
        SaveFileDialog dlg = new SaveFileDialog();
        dlg.FileName = "UIElement File"; // Default file name
        dlg.DefaultExt = ".xaml"; // Default file extension
        dlg.Filter = "Xaml File (.xaml)|*.xaml"; // Filter files by extension

        // Show save file dialog box
        Nullable<bool> result = dlg.ShowDialog();

        // Process save file dialog box results
        if (result == true)
        {
            // Save document
            string filename = dlg.FileName;
            SerializeToXAML(myCanvas.Children, filename);
        }
    }

    private void btnLoad_Click(object sender, RoutedEventArgs e)
    {
        Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();
        dlg.DefaultExt = ".xaml"; // Default file extension
        dlg.Filter = "Xaml File (.xaml)|*.xaml"; // Filter files by extension

        // Show open file dialog box
        Nullable<bool> result = dlg.ShowDialog();

        // Process open file dialog box results
        if (result == true)
        {
            string filename = dlg.FileName;
            UIElementCollection elements = DeSerializeXAML(filename) as UIElementCollection;

            // Add all child elements (lines, rectangles etc) to canvas
            myCanvas.Children.Clear();
            foreach (UIElement el in elements)
            {
                myCanvas.Children.Add(el);
            }
        }
    }
公共静态UIElementCollection反序列化XAML(字符串文件名)
{
//从文件加载XAML。请使用“using”,以便正确处理对象。
使用(System.IO.FileStream fs=System.IO.File.Open(filename,System.IO.FileMode.Open,System.IO.FileAccess.Read))
{
将System.Windows.Markup.XamlReader.Load(fs)作为UIElementCollection返回;//异常
}
}
//使用给定的文件名将任何UIElement对象序列化为XAML。
公共静态void serializedToxaml(UIElementCollection元素,字符串文件名)
{
//使用XamlWriter对象序列化元素
字符串strXAML=System.Windows.Markup.XamlWriter.Save(元素);
//将XAML写入文件。使用“using”以便正确处理对象。
使用(System.IO.FileStream fs=System.IO.File.Create(文件名))
{
使用(System.IO.StreamWriter StreamWriter=new System.IO.StreamWriter(fs))
{
streamwriter.Write(strXAML);
}
}
}
私有void btnSave_单击(对象发送方,路由目标)
{
SaveFileDialog dlg=新建SaveFileDialog();
dlg.FileName=“UIElement File”;//默认文件名
dlg.DefaultExt=“.xaml”//默认文件扩展名
dlg.Filter=“Xaml文件(.Xaml)|*.Xaml”//按扩展名筛选文件
//显示保存文件对话框
可为空的结果=dlg.ShowDialog();
//“处理保存文件”对话框结果
如果(结果==真)
{
//保存文档
字符串文件名=dlg.filename;
序列化Toxaml(myCanvas.Children,文件名);
}
}
私有无效btnLoad_单击(对象发送方,路由目标)
{
Microsoft.Win32.OpenFileDialog dlg=新的Microsoft.Win32.OpenFileDialog();
dlg.DefaultExt=“.xaml”//默认文件扩展名
dlg.Filter=“Xaml文件(.Xaml)|*.Xaml”//按扩展名筛选文件
//“显示打开的文件”对话框
可为空的结果=dlg.ShowDialog();
//“处理打开的文件”对话框结果
如果(结果==真)
{
字符串文件名=dlg.filename;
UIElementCollection元素=反序列化XAML(文件名)作为UIElementCollection;
//将所有子元素(线、矩形等)添加到画布
myCanvas.Children.Clear();
foreach(元素中的UIEL元素)
{
myCanvas.Children.Add(el);
}
}
}
这在序列化中可以正常工作,但在反序列化时会引发异常

异常文本(用google翻译):“您没有找到适合该类型的构造函数”System.Windows.Controls.UIElementCollection

“您可以使用参数或FactoryMethod指令生成此类型。”:行号“1”和位置在“22”行


UIElementCollection
不用于序列化。它意味着在构建WPF可视化树时使用。

一个
UIElementCollection
实例绑定到一个特定的
visual
,因此,它不适合序列化(正如@kostya-k指出的)。反序列化逻辑不知道如何创建新的
UIElementCollection
,因为它不知道与哪个
Visual
关联。无论如何,创建一个新集合是毫无意义的,因为您只需将值传输到
myCanvas.Children

好消息是,您可以使用
XamlObjectWriter
直接填充
myCanvas.Children
,而不是实例化新集合:

public static void DeSerializeXAML(UIElementCollection elements, string filename)
{
    var context = System.Windows.Markup.XamlReader.GetWpfSchemaContext();

    var settings = new System.Xaml.XamlObjectWriterSettings
                       {
                           RootObjectInstance = elements
                       };

    using (var reader = new System.Xaml.XamlXmlReader(filename))
    using (var writer = new System.Xaml.XamlObjectWriter(context, settings))
    {
        System.Xaml.XamlServices.Transform(reader, writer);
    }
}

private void btnLoad_Click(object sender, RoutedEventArgs e)
{
    Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();
    dlg.DefaultExt = ".xaml"; // Default file extension
    dlg.Filter = "Xaml File (.xaml)|*.xaml"; // Filter files by extension

    // Show open file dialog box
    Nullable<bool> result = dlg.ShowDialog();

    // Process open file dialog box results
    if (result == true)
    {
        string filename = dlg.FileName;
        myCanvas.Children.Clear();
        DeSerializeXAML(myCanvas.Children, filename);
    }
}
publicstaticvoid反序列化XAML(UIElementCollection元素,字符串文件名)
{
var context=System.Windows.Markup.XamlReader.GetWpfSchemaContext();
var settings=new System.Xaml.XamlObjectWriterSettings
{
RootObjectInstance=元素
};
使用(var reader=new System.Xaml.XamlXmlReader(文件名))
使用(var writer=new System.Xaml.XamlObjectWriter(上下文,设置))
{
System.Xaml.XamlServices.Transform(读写器);
}
}
私有无效btnLoad_单击(对象发送方,路由目标)
{
Microsoft.Win32.OpenFileDialog dlg=新的Microsoft.Win32.OpenFileDialog();
dlg.DefaultExt=“.xaml”//默认文件扩展名
dlg.Filter=“Xaml文件(.Xaml)|*.Xaml”//按扩展名筛选文件
//“显示打开的文件”对话框
可为空的结果=dlg.ShowDialog();
//“处理打开的文件”对话框结果
如果(结果==真)
{
字符串文件名=dlg.filename;
myCanvas.Children.Clear();
反序列化XAML(myCanvas.Children,文件名);
}
}

但后者并不排除前者。也许他想出口WPF视觉树。