2017-10-02 32 views
-2

は、私はいくつかのコードを持っています。C#のシリアル化UIElementCollection

例外のテキスト(Googleで翻訳されています): "タイプ" System.Windows.Controls.UIElementCollectionに適したコンストラクタが見つかりませんでした。

"ArgumentsまたはFactoryMethodディレクティブを使用してこのタイプを生成できます。":行番号 "1"、行番号 "22"。

答えて

0

UIElementCollectionは、シリアル化を目的としたものではありません。これは、WPFビジュアルツリーを構築するときに使用することを意味します。

+0

後者はしかし、前者を排除するものではないが。 WPFビジュアルツリーをエクスポートしたいと思うかもしれません。 – SlapY

1

UIElementCollectionインスタンスが特定のVisualに関連付けられているため、シリアライズには適していません(@ kostya-kが指摘するように)。デシリアライゼーションロジックは、をどのように作成するかを知らないため、Visualと関連付ける必要があります。とにかく値をmyCanvas.Childrenに転送するだけなので、新しいコレクションを作成するのは無意味です。

良いニュースは、あなたがmyCanvas.Children直接代わりに新しいコレクションinstantiatatingの移入にXamlObjectWriterを使用することができるということです。

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