だから、私はいくつかのコントロールを備えたこのウィンドウを持っています。リソースセクションでは、このスタイルを定義しました。
<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のデフォルト値でのみ機能します。つまり、プロパティの変更に反応しません)。
これを達成する方法について何かアイデアはありますか?