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