【问题标题】:Reverse engineer a ControlTemplate对 ControlTemplate 进行逆向工程
【发布时间】:2011-08-01 01:23:46
【问题描述】:

Windows Workflow Foundation 4 包含一个类似于可用于 Winforms 的 WPF 属性网格。顶部的工具栏有一个 CLEAR 按钮,而不是 Visual Studio 显示的 X。此控件具有在运行时不为空的 ControlTemplate 属性。该模板为工具栏按钮使用了各种字形。

是否有任何工具或技术可以让我提取此模板?我想检查和修改 XAML 以重新设置工具栏的样式(主要是更改按钮标签)。

我对模板对象具有编程访问权限,但我不确定如何将其序列化为 XAML。

【问题讨论】:

  • 不是答案,但你可以snoop它。

标签: wpf xaml workflow-foundation-4 controltemplate


【解决方案1】:

您是否尝试过简单地使用XamlWriter.Save?

例如

var template = control.Template;
using (var stream = new FileStream("template.xaml", FileMode.Create))
{
    using (var writer = XmlWriter.Create(stream, new XmlWriterSettings() { Indent = true }))
    {
        XamlWriter.Save(template, writer);
    }
}

【讨论】:

  • 非常好的尝试。不幸的是,它与Cannot serialize a non-public type 'System.Activities.Presentation.Internal.PropertyEditing.KeyboardEnabledRadioButton'.
  • 如果我错了,请纠正我,但我认为这告诉我模板是以编程方式创建的,因为它不能表示为 XAML。我想在某些时候我将不得不编写一个忽略保护级别的 XamlWriter 实现,但翻录模板不是我经常做的事情:)。
  • 是什么让你觉得它不能用 XAML 表达?
  • 既然你问了这个问题,我想到你根本不会用标记来设置这个特定的成员。按照这个逻辑,XmlWriter 应该简单地忽略这些成员。可惜源不可用,改变这种行为很容易。
  • 有问题的对象不是一个成员,而是一个类,你可以在 XAML 中使用内部类,它只是不会“正常”发生,因为 VS 会关闭 Windows 和 UserControls默认公开。
【解决方案2】:

你试过红门的反射器吗?当然,如果程序集被混淆,它可能并没有太大帮助。

【讨论】:

    猜你喜欢
    • 2016-04-01
    • 1970-01-01
    • 2011-02-23
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 2011-11-19
    • 2018-08-26
    • 2014-02-22
    相关资源
    最近更新 更多