【问题标题】:How do I reliably determine if a `ControlTemplate` is being used in a WPF application?如何可靠地确定 WPF 应用程序中是否正在使用“ControlTemplate”?
【发布时间】:2014-12-23 20:02:26
【问题描述】:

如何可靠地确定 WPF 应用程序中是否正在使用以下 ControlTemplate?文件名为“CheckBoxTemplates.xaml”,与主应用程序位于不同的程序集中。注意,当我搜索文件名和资源键时没有结果。此外,搜索资源密钥的解决方案是不可靠的。特别是当有五个资源字典文件包含相同的键时。

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:mwt="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Luna">
    <Style x:Key="invertedCheckBox"
           TargetType="CheckBox">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate  TargetType="CheckBox"
...

更多信息

虽然 user2250152 答案对于上述 XAML 是正确的。它不能可靠地确定样式是否正在使用中。我这样说是因为,当我将该技术用于另一种样式时,我发现五个资源字典文件包含相同的键。因此,我们必须考虑如何可靠地确定使用重复键定义的样式。

【问题讨论】:

  • 在运行时还是编译时?
  • 要么。应用程序中的样式导致问题。第一步是消除死样式。我将不胜感激。即使是单独的工具也会有所帮助。
  • @PatrickHofman;我不明白。

标签: .net wpf controltemplate


【解决方案1】:

ReSharper 显示死代码。虽然它的检测算法并不完美,但它是一个好的开始,允许您跳过它显示为使用的任何样式。对于显示为未使用的任何样式,您可以检查它是否实际上未使用(例如通过搜索解决方案)。

【讨论】:

  • 这也适用于 xaml 样式吗?没找到。
  • 我认为 ReSharper 不起作用。我故意造成了一个未使用的样式,它没有给出任何指示。
  • 检测算法并不完美,我上次使用它时,它破坏了正在使用的样式。不用说,他们永远不会那么完美。就OP问题而言,答案是否定的,没有可靠的方法:-)。不可能,就这么简单。正如帕特里克所说,当事件发生、触发器发生等时,样式可以在运行时更改。它是不确定的。
  • @Chris:是的。毕竟,外观类可能是最好的选择。
【解决方案2】:

我能想到几个选项:

  • “开发时间”解决方案:这包括搜索每个文件是否存在Style="{StaticResource StyleName}" 或类似的东西。这在很多情况下都有效,但不是自动化的,也不是很可靠;

  • 运行时解决方案:您可以实例化类库中的每个控件,并遍历其中的每个元素,检查当前分配的Style。这仅适用于立即设置的样式,而不适用于事件等期间;

  • “代码”解决方案:您可以创建自己的外观静态类,这是获取样式的入口点。请注意,您不能再使用Style="{StaticResource StyleName}",而是Style="{StaticResource SomeStaticClass.StyleName}"。只有当您有一个习惯于这种工作方法的高质量开发团队时,这才会起作用。您可以计算在程序期间访问样式的次数。如果在很长一段时间后,Style 还没有被使用,它可能是要摆脱的候选者。

【讨论】:

  • 有趣。我做了第 1 项,但不可靠,因此提出了问题。第 3 项是个好主意,但它会涵盖未明确设置样式的情况吗?对于第 2 项,也许 Snoop 可以做到这一点?
  • 我找不到使用 Snoop 的方法。
  • 好的。我对所有的 WPF 工具都不是很熟悉。我明天在办公室看看。
  • 对不起。办公室里紧张的一天。没有太多时间来研究这个。
  • 没问题。由于使用了x:Key,我可以可靠地删除这个控制模板。 user2250152 的回答和一些实验为这个具体案例提供了可靠的答案。然而,在多个文件中定义的其他样式仍然存在问题。
【解决方案3】:

到达那里的非正统方法是创建一个附加属性,打印出谁在使用 ControlTemplate :) 这样想:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:mwt="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Luna">
    <Style x:Key="invertedCheckBox"
           TargetType="CheckBox">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate  TargetType="CheckBox">
                 <Border my:WhoIsMyDaddy="true" ...>

my:WhoIsMyDaddy 可能是一个附加属性,当设置为“true”时,它会在初始化时触发 propertychanged 事件处理程序。调用处理程序后,您将能够访问作为附加属性所有者的控件实例。最后,只需使用该实例打印出您想要的任何内容。

【讨论】:

  • 有趣。唯一的缺点是您必须使用复选框控制。
  • 我必须转到每个使用CheckBox 的屏幕来使用(练习)每个复选框以查看是否使用了模板。对吗?
  • 不!如果您的所有复选框都使用倒置CheckBox 样式,它们都会初始化附加属性。每个复选框都有自己的布尔附加属性。当您在处理程序中设置断点时,您将看到何时以及哪个复选框将依赖属性附加到它们自己。这样您就可以知道您的 controltemplate 是否正在被使用。
【解决方案4】:

您可以使用 VisualStudio 和“在文件中查找”工具。尝试在整个解决方案中查找样式键,例如 invertedCheckBox。这样您就可以确定样式的使用位置。

【讨论】:

  • 我已经这样做了,但没有找到文件名。我还搜索了“钥匙”。我如何知道CheckBox 是否使用这种风格?这就是我发布问题的原因。我需要一个可靠的方法。
  • 在您的解决方案中查找所有CheckBoxes。检查CheckBox是否有样式属性设置为Style="{StaticResource invertedCheckBox}"如果你什么也没找到,那么你可以确定这个样式没有被使用。
  • 我这样做了,但没有发现任何用处。然后我创建了一个测试项目并进行了一些测试。似乎如果x:Key 被定义并且没有被使用,那么样式就没有被使用。没有隐式使用,因为始终基于TargetType 生成密钥。
  • 是的。你了解隐式、显式和默认样式吗?
    显式样式 - Style 属性是直接设置的。在大多数情况下,样式不是内联定义的,而是通过显式键作为资源引用。
    隐式样式 - 不直接设置 Style 属性。但是,样式存在于资源查找序列(页面、应用程序)中的某个级别,并且使用与要应用样式的类型匹配的资源键进行键控。
  • 默认样式 - 也称为主题样式。 Style 属性不是直接设置的,实际上直到运行时才会读取为 null。在这种情况下,样式来自作为 WPF 表示引擎一部分的运行时主题评估。对于不在主题中的隐式样式,类型必须完全匹配——MyButton Button 派生类不会隐式使用 Button 的样式。
【解决方案5】:

根据你说的

文件名为“CheckBoxTemplates.xaml”,与主应用程序位于不同的程序集中。注意,我搜索文件名和资源键时没有结果。

您可以确定没有使用此样式。 据我所知,不会自动加载任何 XAML 文件(应用程序资源和主题除外) 意味着任何控件都无法显式或隐式引用此样式(这似乎已被卸载 - 除非您在魔术加载 XAML 文件中有一些代码)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    • 2020-12-25
    相关资源
    最近更新 更多