关于c#:如何克隆WPF对象?

关于c#:如何克隆WPF对象?

How can you clone a WPF object?

任何人都有一个很好的示例,该示例如何深度克隆WPF对象并保留数据绑定?

标记的答案是第一部分。

第二部分是您必须创建一个ExpressionConverter并将其注入序列化过程。 详细信息在这里:
http://www.codeproject.com/KB/WPF/xamlwriterandbinding.aspx?fid=1428301&df=90&mpp=25&noise=3&sort=Position&view=Quick&select=2801571


我做过的最简单的方法是使用XamlWriter将WPF对象另存为字符串。 Save方法将序列化对象及其逻辑树中的所有子对象。现在,您可以创建一个新对象,并使用XamlReader加载它。

例如:
将对象写入xaml(假设该对象是Grid控件):

1
string gridXaml = XamlWriter.Save(myGrid);

将其加载到新对象中:

1
2
3
StringReader stringReader = new StringReader(gridXaml);
XmlReader xmlReader = XmlReader.Create(stringReader);
Grid newGrid = (Grid)XamlReader.Load(xmlReader);

在.NET 4.0中,新的xaml序列化堆栈使此MUCH更容易。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var sb = new StringBuilder();
var writer = XmlWriter.Create(sb, new XmlWriterSettings
{
    Indent = true,
    ConformanceLevel = ConformanceLevel.Fragment,
    OmitXmlDeclaration = true,
    NamespaceHandling = NamespaceHandling.OmitDuplicates,
});
var mgr = new XamlDesignerSerializationManager(writer);

// HERE BE MAGIC!!!
mgr.XamlWriterMode = XamlWriterMode.Expression;
// THERE WERE MAGIC!!!

System.Windows.Markup.XamlWriter.Save(this, mgr);
return sb.ToString();

这里有一些很好的答案。很有帮助。我尝试了多种方法来复制绑定信息,包括http://pjlcon.wordpress.com/2011/01/14/change-a-wpf-binding-from-sync-to-async-programatically/中概述的方法,但是这里的信息是Internet上最好的!

我创建了一个可重用的扩展方法来处理InvalidOperationException"绑定在使用后无法更改。"在我的场景中,我维护着某些人编写的代码,并且在主要的DevExpress DXGrid框架升级之后,它不再起作用。以下完美解决了我的问题。我返回对象的代码部分可能会更好,稍后我将对其进行重构。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/// <summary>
/// Extension methods for the WPF Binding class.
/// </summary>
public static class BindingExtensions
{
    public static BindingBase CloneViaXamlSerialization(this BindingBase binding)
    {
        var sb = new StringBuilder();
        var writer = XmlWriter.Create(sb, new XmlWriterSettings
        {
            Indent = true,
            ConformanceLevel = ConformanceLevel.Fragment,
            OmitXmlDeclaration = true,
            NamespaceHandling = NamespaceHandling.OmitDuplicates,
        });
        var mgr = new XamlDesignerSerializationManager(writer);

        // HERE BE MAGIC!!!
        mgr.XamlWriterMode = XamlWriterMode.Expression;
        // THERE WERE MAGIC!!!

        System.Windows.Markup.XamlWriter.Save(binding, mgr);
        StringReader stringReader = new StringReader(sb.ToString());
        XmlReader xmlReader = XmlReader.Create(stringReader);
        object newBinding = (object)XamlReader.Load(xmlReader);
        if (newBinding == null)
        {
            throw new ArgumentNullException("Binding could not be cloned via Xaml Serialization Stack.");
        }

        if (newBinding is Binding)
        {
            return (Binding)newBinding;
        }
        else if (newBinding is MultiBinding)
        {
            return (MultiBinding)newBinding;
        }
        else if (newBinding is PriorityBinding)
        {
            return (PriorityBinding)newBinding;
        }
        else
        {
            throw new InvalidOperationException("Binding could not be cast.");
        }
    }
}

怎么样:

1
2
3
4
5
6
7
8
9
10
11
12
    public static T DeepClone< T >(T from)
    {
        using (MemoryStream s = new MemoryStream())
        {
            BinaryFormatter f = new BinaryFormatter();
            f.Serialize(s, from);
            s.Position = 0;
            object clone = f.Deserialize(s);

            return (T)clone;
        }
    }

当然,这种深度克隆会克隆任何对象,它可能不是镇上最快的解决方案,但维护最少。


推荐阅读

    Python之可迭代对象、迭代器、生成器

    Python之可迭代对象、迭代器、生成器,迭代,生成器,一、概念描述可迭代对象就是可以迭代的对象,我们可以通过内置的iter函数获取其迭代器,可

    应用程序对象

    应用程序对象,,应用程序对象是一个应用程序级对象,用于在所有用户之间共享信息,并且在Web应用程序运行期间可以保存数据。 应用的性质: 方法

    Java创建对象的几种方式

    Java创建对象的几种方式,对象,方法,本文目录Java创建对象的几种方式java中几种创建对象的方式1Java中创建对象的集中方式有那些JAVA创建对

    电脑硬盘克隆复制方法|硬盘克隆教程

    电脑硬盘克隆复制方法|硬盘克隆教程,,硬盘克隆教程打开电脑机箱,一般电脑硬盘数据接口都至少有两个,电脑开机的时候一般识别有系统的硬盘位

    电脑克隆mac|电脑克隆系统

    电脑克隆mac|电脑克隆系统,,1. 电脑克隆系统把一台电脑的硬盘放在另一台电脑上装系统,这是一个非常简单的系统克隆安装技术,主要用于某台电

    wps快速的编辑图层|WPS巧用对象图层

    wps快速的编辑图层|WPS巧用对象图层,图层,编辑,快速,wps,1.WPS 如何巧用对象图层一、认识对象图层工具及按纽1、您可以在插件工具栏中可以