代码之家  ›  专栏  ›  技术社区  ›  Carlos Melo

为什么这个基于祖先附加属性更改元素样式的数据触发器不起作用?

  •  0
  • Carlos Melo  · 技术社区  · 14 年前

    所以,这个窗口有一些控件。在参考资料部分中,我定义了这种样式:

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

    关于如何完成这项工作有什么想法吗?

    1 回复  |  直到 13 年前
        1
  •  1
  •   Ian Griffiths    14 年前

    你把另一个名字传给了 DependencyProperty.RegisterAttached 比你在C#中给出的名字还要多。所以DP系统认为 CurrentSystemTheme ,但你的代码认为 CurrentTheme . 试穿 当前主题 作为第一个论点 RegisterAttached .

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