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