2017-10-02 5 views
-2

나는 몇 가지 코드가 있습니다.C# 직렬화 UIElementCollection

텍스트의 예외 (Google로 번역됨) : "유형"System.Windows.Controls.UIElementCollection에 적합한 생성자를 찾지 못했습니다.

"인수 또는 FactoryMethod 지정 문을 사용하여이 유형을 생성 할 수 있습니다.": 줄 번호 "1"및 줄 "22"위치.

답변

0

UIElementCollection은 직렬화를위한 것이 아닙니다. WPF 비주얼 트리를 만들 때 사용하기위한 것입니다.

+0

후자를하지만 전자를 배제하지 않는다 :

좋은 소식

는 대신 새 컬렉션을 instantiatating의 myCanvas.Children직접을 채울 XamlObjectWriter를 사용할 수 있다는 것입니다. 어쩌면 WPF 비주얼 트리를 내보낼 수도 있습니다. – SlapY

1

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