programing

WPF 개체를 복제하려면 어떻게 해야 합니까?

newstyles 2023. 4. 19. 22:34

WPF 개체를 복제하려면 어떻게 해야 합니까?

WPF 오브젝트를 딥 클로닝하여 데이터 인덱스를 보존하는 좋은 예를 들어보신 분 계십니까?


첫 번째 부분이 마크된 답이에요.

두 번째 부분은 Expression Converter를 생성하여 시리얼라이제이션프로세스에 삽입해야 합니다.상세한 것에 대하여는, 이하를 참조해 주세요.
http://www.codeproject.com/KB/WPF/xamlwriterandbinding.aspx?fid=1428301&df=90&mpp=25&noise=3&sort=Position&view=Quick&select=2801571

가장 간단한 방법은 XamlWriter를 사용하여 WPF 개체를 문자열로 저장하는 것입니다.저장 메서드는 논리 트리의 개체와 모든 개체를 직렬화합니다.이제 새 개체를 생성하여 XamlReader를 사용하여 로드할 수 있습니다.

예: 개체를 xaml에 씁니다(개체가 그리드 컨트롤이라고 가정합니다).

string gridXaml = XamlWriter.Save(myGrid);

새 개체에 로드합니다.

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

.NET 4.0에서는 새로운 xaml 시리얼라이제이션스택에 의해 이 작업이 쉬워집니다.

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/에서 설명하는 방법을 포함하여 다양한 방법을 시도했지만, 이 정보는 인터넷에서 가장 우수합니다!

Invalid Operation 처리에 재사용 가능한 확장 메서드를 만들었습니다.예외 "바인딩을 사용한 후에는 변경할 수 없습니다."시나리오에서는 누군가가 작성한 코드를 유지하고 있었는데 DevExpress DXGrid 프레임워크를 대폭 업그레이드한 후 더 이상 작동하지 않았습니다.제 고민은 다음과 같이 완벽하게 해결되었습니다.코드 중 오브젝트를 반환하는 부분이 더 좋을 수 있습니다.나중에 재계수 하겠습니다.

/// <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.");
        }
    }
}

그럼 어떻게 해?

    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;
        }
    }

물론, 이 깊은 클론은 모든 개체를 복제합니다. 그리고 이 솔루션이 이 도시에서 가장 빠른 솔루션은 아닐 수도 있지만 유지보수가 가장 적습니다.:)

언급URL : https://stackoverflow.com/questions/32541/how-can-you-clone-a-wpf-object