Итак, у меня есть это окно с некоторыми элементами управления. В разделе ресурсов я определил этот стиль:
<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, т. Е. Не реагирует на изменения в свойство).
Есть идеи, как этого добиться?