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.RegisterAttachedC#でプロパティに付けた名前とは異なる名前をに渡しました。したがって、DPシステムはそれがと呼ばれていると見なしCurrentSystemThemeますが、コードはそれがと呼ばれていると見なしますCurrentThemeCurrentThemeの最初の引数として渡してみてくださいRegisterAttached

また、データバインディングのWPFデバッグログ出力を有効にすることもできます(これは、古いバージョンのWPFではデフォルトでオンになっていますが、.NET 4 / VS 2010では、[ツール]->[オプション]ウィンドウでオンにする必要があります。 [デバッグ]->[出力ウィンドウ]の下)。このように、私は通常、[WPFトレース設定]->[データバインディング]オプションを[すべて]に設定します。そうすれば、データバインディングが失敗した場合、[出力]ウィンドウにエラーが表示されます。これは、そのデータトリガーが失敗する理由を診断するのに役立つ場合があります。

于 2010-11-17T01:21:14.243 に答える