所以,我有一些带有一些控件的Window。在资源部分,我已经定义了这种风格:
<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的默认值,即,不会对属性)。
关于如何实现这一目标的任何想法?
答案 0 :(得分:1)
您向DependencyProperty.RegisterAttached
传递的名称与您在C#中为该属性提供的名称不同。因此DP系统认为它被称为CurrentSystemTheme
,但您的代码认为它被称为CurrentTheme
。尝试将CurrentTheme
作为第一个参数传递给RegisterAttached
。
此外,您可能希望为数据绑定启用WPF调试日志输出(默认情况下在旧版本的WPF中启用,但在.NET 4 / VS 2010中,您需要在工具中将其打开 - &gt;调试 - >输出窗口下的选项窗口。这样,我通常设置WPF跟踪设置 - &gt; All的数据绑定选项。这样,如果数据绑定失败,您将在“输出”窗口中看到错误。这可能有助于您诊断数据触发器失败的原因。