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
'programing' 카테고리의 다른 글
wpf에서 이미지를 플립하는 방법 (0) | 2023.04.19 |
---|---|
tar, gz, zip 또는 bzip2를 사용하여 파일 분할 (0) | 2023.04.19 |
SQL Server에서 PAGEIOLACH_SH 대기 유형은 무엇입니까? (0) | 2023.04.19 |
Xcode 4.4 릴리즈 노트에 언급된 "Objective-C Literals"의 세부 사항은 무엇입니까? (0) | 2023.04.19 |
프로젝트의 단일 파일에 대해 ARC를 비활성화하려면 어떻게 해야 합니까? (0) | 2023.04.19 |