Блог в котором есть много интересной информации…
Во-первых, для подключения 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 в каждую тему