は、私はいくつかのコードを持っています。C#のシリアル化UIElementCollection
例外のテキスト(Googleで翻訳されています): "タイプ" System.Windows.Controls.UIElementCollectionに適したコンストラクタが見つかりませんでした。
"ArgumentsまたはFactoryMethodディレクティブを使用してこのタイプを生成できます。":行番号 "1"、行番号 "22"。
は、私はいくつかのコードを持っています。C#のシリアル化UIElementCollection
例外のテキスト(Googleで翻訳されています): "タイプ" System.Windows.Controls.UIElementCollectionに適したコンストラクタが見つかりませんでした。
"ArgumentsまたはFactoryMethodディレクティブを使用してこのタイプを生成できます。":行番号 "1"、行番号 "22"。
UIElementCollection
は、シリアル化を目的としたものではありません。これは、WPFビジュアルツリーを構築するときに使用することを意味します。
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);
}
}
後者はしかし、前者を排除するものではないが。 WPFビジュアルツリーをエクスポートしたいと思うかもしれません。 – SlapY