0

所以,我有这个带有一些控件的窗口。在资源部分我定义了这种风格:

<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 的默认值,即不对属性的更改做出反应)。

关于如何做到这一点的任何想法?

4

1 回答 1

1

您传递的名称与DependencyProperty.RegisterAttached您在 C# 中为属性指定的名称不同。所以 DP 系统认为它是被调用的CurrentSystemTheme,但是你的代码认为它是被调用的CurrentTheme。尝试CurrentTheme作为第一个参数传递给RegisterAttached.

此外,您可能希望为数据绑定启用 WPF 调试日志输出(在旧版本的 WPF 中默认启用,但在 .NET 4/VS 2010 中,您需要在“工具”->“选项”窗口中将其打开在调试-> 输出窗口下)。这样,我通常将 WPF Trace Settings -> Data Binding 选项设置为 All。这样,如果数据绑定失败,您将在“输出”窗口中看到错误。这可能会帮助您诊断该数据触发器失败的原因。

于 2010-11-17T01:21:14.243 回答