如何可靠地确定WPF应用程序中是否正在使用`ControlTemplate`?

时间:2014-12-23 20:02:27

标签: .net wpf controltemplate

如何可靠地确定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是正确的。它无法可靠地确定是否正在使用样式。我这样说是因为当我将这种技术用于另一种风格时,我发现了五个包含相同密钥的资源字典文件。因此,我们必须考虑如何可靠地确定使用重复键定义的样式。

5 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

我可以想到几个选项:

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

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

  • 'code'解决方案:您可以创建自己的facade静态类,这是获取样式的入口点。请注意,您不能再使用Style="{StaticResource StyleName}",而是Style="{StaticResource SomeStaticClass.StyleName}"。只有当您拥有一个习惯于这种工作方法的高质量开发团队时,这才有效。您可以计算在程序持续时间内访问样式的次数。如果经过很长时间后,Style还没有被使用,那么它可能是摆脱它的候选者。

答案 2 :(得分:2)

非正统的方法是创建一个附加属性,打印出谁正在使用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事件处理程序。一旦调用处理程序,您将能够访问作为附加属性的所有者的控件实例。最后,只需使用该实例打印出您想要的任何内容。

答案 3 :(得分:1)

您可以使用VisualStudio和&#34;在文件中查找&#34;工具。尝试在整个解决方案中查找样式键,例如invertedCheckBox。因此,您可以确定样式的使用位置。

答案 4 :(得分:0)

根据你的说法

  

文件名是&#39; CheckBoxTemplates.xaml&#39;并且与主应用程序的装配不同。请注意,当我搜索文件名和资源键时没有结果。

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