나는 몇 가지 코드가 있습니다.C# 직렬화 UIElementCollection
텍스트의 예외 (Google로 번역됨) : "유형"System.Windows.Controls.UIElementCollection에 적합한 생성자를 찾지 못했습니다.
"인수 또는 FactoryMethod 지정 문을 사용하여이 유형을 생성 할 수 있습니다.": 줄 번호 "1"및 줄 "22"위치.
나는 몇 가지 코드가 있습니다.C# 직렬화 UIElementCollection
텍스트의 예외 (Google로 번역됨) : "유형"System.Windows.Controls.UIElementCollection에 적합한 생성자를 찾지 못했습니다.
"인수 또는 FactoryMethod 지정 문을 사용하여이 유형을 생성 할 수 있습니다.": 줄 번호 "1"및 줄 "22"위치.
UIElementCollection
은 직렬화를위한 것이 아닙니다. WPF 비주얼 트리를 만들 때 사용하기위한 것입니다.
UIElementCollection
인스턴스가 특정 Visual
에 연결되어 있으므로 직렬화에 적합하지 않습니다 (@ kostya-k가 가리키는 것처럼). deserialization 논리는 어떤 Visual
과 연결할 지 모르기 때문에 새로운 UIElementCollection
을 만드는 방법을 알지 못합니다. 값을 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);
}
}
후자를하지만 전자를 배제하지 않는다 :
좋은 소식
는 대신 새 컬렉션을 instantiatating의myCanvas.Children
직접을 채울XamlObjectWriter
를 사용할 수 있다는 것입니다. 어쩌면 WPF 비주얼 트리를 내보낼 수도 있습니다. – SlapY