所以,我有这个带有一些控件的窗口。在资源部分我定义了这种风格:
<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 的默认值,即不对属性的更改做出反应)。
关于如何做到这一点的任何想法?