如何以 XAML 格式(可视树)在 WPF 中获取现有控件的 ControlTemplate?这是为了帮助在现有模板的帮助下创建新的 ControlTemplate。
8 回答
样式和模板示例在 MSDN 上可供下载,请参阅Default WPF Themes
链接。
但是,您也可以扩展现有样式,而无需使用BasedOn
属性重新定义所有内容。
如果您有Expression Blend,您可以:
- 将控件拖到设计图面上
- 右键单击控件并选择编辑模板 -> 编辑副本
当您执行此操作时,Blend 将从控件中提取基本模板,并在文档/应用程序中明确将其声明为资源,然后您可以根据自己的喜好对其进行编辑。您可以对任何控件执行此操作。
Matthew MacDonald 的“Pro WPF in C# 2008”一书在第 15 章中包含了一个控制模板浏览器。我相信您可以从 Apress 网站下载示例代码。
2020 年更新:
WPF 组件的所有样式和模板现在都移到了这里。
但是,在创建一个新组件之前,只需检查一下,看看你是否有一个好的替代方案(也许改变样式可以工作)。
注意:通常,它有一堆 DynamicResource 绑定,您可能想用您的绑定替换它们并使其成为静态。如果您不想做太多手动工作,您可以考虑使用下面的第二种解决方案。
第二种和更短的解决方案可能是使用 Microsoft Blend 通过以下步骤 提取模板:
右键单击控件 >
Edit Template
>Edit Current
或Edit a Copy
但是要小心这个,因为它并不总是导出整个模板,
而是导出它的必要部分。
只需考虑将此模板与官方模板(如上所述)进行比较,以确保一切正常。
为此使用 Microsoft Blend:将整个 XAML 代码粘贴到此工具的文件中,然后右键单击要感知其可视化树的控件:
选择选项:编辑模板,然后就可以了
XamlWriter 类为您提供了此功能。如果controlName
是控件的名称,则使用下面的代码段可以在stringBuilder
对象内获得控件模板的 Xaml。我猜答案中提到的工具利用了这个类。
var stringBuilder = new StringBuilder();
var xmlSettings = new XmlWriterSettings
{
Indent = true
};
using (var xmlWriter = XmlWriter.Create(stringBuilder, xmlSettings))
{
XamlWriter.Save(controlName.Template, xmlWriter);
}