Во-первых, для подключения ThemeManger-а к контролу, в конструкторе надо добавить следующие строки:
public partial class AlarmsPage : UserControl { public AlarmsPage() { InitializeComponent(); ThemeManager.ApplyTheme(this, ThemeManager.CurrentTheme); ThemeManager.OnThemeChanged += (s, e) => { ThemeManager.ApplyTheme(this, ThemeManager.CurrentTheme); }; } }
понятное дело, что этот код можно вынести в отдельный метод.
За счет того, что в темах используется DymanicResource, становится невозможным использование неявного изменения стиля в XAML, поэтому в некоторых случаях от таких конструкций мы избавляемся:
<Grid.Resources> <Style TargetType="{x:Type controls:GeoBox}"> <Setter Property="Margin" Value="0, 3, 0, 3"/> </Style> <Style TargetType="{x:Type Label}"> <Setter Property="VerticalAlignment" Value="Center"/> </Style> </Grid.Resources>
и затем прописываем вручную свойства каждому контролу (например HorizontalAlignment для Label):
<Label Content="{l:Translate LAT}" Grid.Column="0" Grid.Row="1" HorizontalAlignment="Right"/> <controls:GeoBox Grid.Column="1" Grid.Row="1" ValueType="Latitude" Value="{Binding Latitude, Mode=OneWay}" IsReadOnly="True" /> <Label Content="{l:Translate LON}" Grid.Column="0" Grid.Row="2" HorizontalAlignment="Right" /> <controls:GeoBox Grid.Column="1" Grid.Row="2" ValueType="Longitude" Value="{Binding Longitude, Mode=OneWay}" IsReadOnly="True"/> <Label Content="{l:Translate Range}" Grid.Column="2" Grid.Row="1" HorizontalAlignment="Right"/> <controls:GeoBox Grid.Column="3" Grid.Row="1" ValueType="Distance" Value="{Binding Range}" IsReadOnly="True"/> <Label Content="{l:Translate Bearing}" Grid.Column="2" Grid.Row="2" HorizontalAlignment="Right"/> <controls:GeoBox Grid.Column="3" Grid.Row="2" ValueType="Angle" Value="{Binding Bearing}" IsReadOnly="True"/>
Для того, чтобы задать следующий стиль, например для TransLabel:
<Style TargetType="local:TransLabel" x:Key="TransLabelMyStyle"> <Setter Property="Margin" Value="0,0,3,0"/> <Setter Property="HorizontalAlignment" Value="Right"/> <Setter Property="VerticalAlignment" Value="Center"/> </Style>
его нужно указывать явно через theme:DynamicContainerStyle.DerivedStyle, причем надо указывать также BaseStyle, так как XAML не позволяет сделать стиль BasedOn={DynamicResource}:
<local:TransLabel Grid.Row="0" Key="Mode" theme:DynamicContainerStyle.BaseStyle="{DynamicResource {x:Type local:TransLabel}}" theme:DynamicContainerStyle.DerivedStyle="{StaticResource TransLabelMyStyle}"/>
если всегда тащить за собой этот theme:DynamicContainerStyle то получается “a bit annoying situation”, но зато темы будут переключаться динамически. Другой вариант – это включить стиль TransLabel в каждую тему