如何从代码中的模板对象中获取实际的XAML(或者我可以)?

时间:2011-04-15 03:10:31

标签: wpf templates xaml baml

不确定这是否可行,但是如果我有一个模板对象(传入OnApplyTemplate覆盖)有什么方法可以检查XAML的字符串表示形式吗?我在内部知道模板的XAML被编译后,它实际上被转换为BAML,并且我知道当代码到达覆盖时,它既不是因为它已经被重新水化为实际对象,这就是我要问的原因。

实际上,如果你可以从模板对象转到XAML,那么理论上你不能从任何WPF对象转到它的XAML表示吗?然而,我只会满足于模板的前者。

这是.NET 4.0中的C#,而不是Silverlight FWIW。

中号

1 个答案:

答案 0 :(得分:7)

旧的XamlWriter类大部分时间都可以工作。 System.Xaml中的新XAML类在尝试将ControlTemplate序列化为XAML时由于某种原因抛出错误。我建议你不要依赖生产代码中的任何XAML写作......

var template = this.FindResource("MyTemplate") as ControlTemplate;

// The new XamlServices class throws an error. 
//string xaml = System.Xaml.XamlServices.Save(template);

// The old XamlWriter from the Markup namespace works (usually)
string xaml = System.Windows.Markup.XamlWriter.Save(template);

// Format the XAML so that it's readable.
string indentedXaml = XElement.Parse(xaml).ToString();

Console.WriteLine(indentedXaml);