【问题标题】:Why this DataTrigger to change element's style based in ancestor attached property isn't working?为什么这个基于祖先附加属性更改元素样式的 DataTrigger 不起作用?
【发布时间】:2010-11-17 01:14:20
【问题描述】:

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

<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 的默认值,即对属性)。

关于如何实现这一点的任何想法?

【问题讨论】:

    标签: c# wpf triggers styles attached-properties


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,伊恩。多么愚蠢的错误:)。它现在起作用了。并感谢您的提示。
    猜你喜欢
    • 1970-01-01
    • 2013-12-21
    • 2019-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-25
    • 2013-08-11
    相关资源
    最近更新 更多