所以,这个窗口有一些控件。在参考资料部分中,我定义了这种样式:
<Style x:Key="StyleNavBar" TargetType="{x:Type Grid}">
<Style.Triggers>
<DataTrigger Binding="{Binding CurrentTheme, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}">
<DataTrigger.Value>
<theme:WinTheme>WindowsClassic</theme:WinTheme>
</DataTrigger.Value>
<Setter Property="Background" Value="#FFFFFFFF" />
</DataTrigger>
</Style.Triggers>
</Style>
在我的窗口中,我定义了一个名为“CurrentTheme”的附加属性,它存储(基于枚举)系统范围内使用的当前主题。代码如下:
public static readonly DependencyProperty CurrentSystemThemeProperty =
DependencyProperty.RegisterAttached(
"CurrentSystemTheme",
typeof(WinTheme),
typeof(MainWindow),
new UIPropertyMetadata(WinTheme.AeroGlass));
public WinTheme CurrentTheme
{
get
{
return (WinTheme)GetValue(CurrentSystemThemeProperty);
}
set
{
SetValue(CurrentSystemThemeProperty, value);
}
}
每次用户更改系统主题时,我的窗口都会通过WndProc接收一个回调,通知主题已更改。而且,如您所见,CurrentTheme属性的默认值是WinTheme.AeroGlass。然后我使用上面定义的样式设置了一个网格样式:
<Grid Height="34" Name="grdNavBar" VerticalAlignment="Top" Style="{DynamicResource StyleNavBar}">
我的目标是基于CurrentTheme的值更改样式,但是当主题更改时,上面定义的触发器不起作用(它只与CurrentTheme的默认值一起工作,即不对属性中的更改作出反应)。
关于如何完成这项工作有什么想法吗?