Win10主题模板无法使用DynamicResource的原因是什么?
关于WPF中Win7与Win10下DynamicResource资源查找行为差异的技术疑问
此问题并非出于实际需求,而是希望深入了解其中的技术细节。
Win7下的可行方案
在Win7的WPF环境中,可通过重写主题项模板使用的资源键来定制控件外观,示例XAML如下:
<SolidColorBrush x:Key="SomeControl.Background">Red</SolidColorBrush> <Style TargetType="{x:Type ns:SomeControl}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type ns:SomeControl}"> <Border Background="{DynamicResource SomeControl.Background}"/> </ControlTemplate> </Setter.Value> </Setter> </Style>
在该模板中,控件模板通过DynamicResource引用SomeControl.Background资源,后续可在控件实例的资源集合中重写此资源键来修改控件背景色,示例代码:
<ns:SomeControl> <ns:SomeControl.Resources> <SolidColorBrush x:Key="SomeControl.Background">Green</SolidColorBrush> </ns:SomeControl.Resources> </ns:SomeControl>
Win10下的失效现象
但在Win10的WPF环境中,上述方案不再生效:DynamicResource无法找到控件实例资源集合中指定的SomeControl.Background资源,必须改用StaticResource才能正常引用主题中的默认资源,这直接导致Win7中的动态重写方案失效。
补充验证示例
完整的验证XAML代码如下:
<UniformGrid Columns="1" > <ns:SomeControl/> <ns:SomeControl> <ns:SomeControl.Resources> <SolidColorBrush x:Key="SomeControl.Background">Green</SolidColorBrush> </ns:SomeControl.Resources> </ns:SomeControl> </UniformGrid>
- Win10运行效果:两个
SomeControl均显示主题默认的红色背景 - Win7运行效果:第一个控件显示红色背景,第二个控件显示重写后的绿色背景
疑问
是什么原因导致了Win7与Win10之间的这一行为差异?WPF或系统中哪些部分的改动使得原方案失效?
内容的提问来源于stack exchange,提问作者EldHasp
相关产品推荐
相关产品推荐

