Интересно почитать… Блог в котором есть много интересной информации…

14 ноября 2014

Добавление темы в WPF контрол

Категория: программирование — dmitriano @ 16:37

Во-первых, для подключения 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 в каждую тему

Линии 3D/Шарики 3D

Комментариев нет »

No comments yet.

RSS feed for comments on this post. TrackBack URL

Leave a comment

SlogPost.ru