Наследование стилей / шаблонов WPF

Я пытаюсь изучить WPF в данный момент и пытаюсь изменить внешний вид элемента управления .Net по умолчанию за счет использования стиля. Я использую C # в качестве предпочтительного языка, хотя весь приведенный ниже код является разметкой WPF.

Сегодня я установил gmail с новой темой (см. Изображение ниже) и, таким образом, поставил себе задачу, которую можно решить в WPF.

New GMail buttons

Что Мне удалось создать среднюю кнопку Спам с помощью стиля с шаблоном управления и триггерами.

Правая и левая кнопки очень похожи, но имеют только 2 различия. У них есть угловой радиус 1 и поля 15 с левой или правой стороны, в то время как средняя кнопка имеет для них обоих значение 0.

Вопросы!

Q1. Вместо того, чтобы копировать весь стиль и изменять только эти 2 атрибута, это можно сделать с помощью какого-либо типа наследования. Где правая и левая кнопки основаны на существующем стиле, но он вносит эти 2 визуальных изменения. Я уже пробовал использовать свойство BasedOn при создании нового стиля, но не смог отредактировать необходимые атрибуты.

Q2. Являются ли стили правильным способом решения этой проблемы в WPF. В WinForms вам нужно создать настраиваемый элемент управления, у которого есть свойство visible, связанное с перечислением, т.е. вы нажимаете кнопку, и параметры стиля могут быть Left, Middle, Right.

Q3. Самый сложный вопрос до последнего. Можно ли это сделать, если к кнопке применен мой стиль. Затем, когда вы установите его цвет фона на синий. Затем кнопка сохраняет градиенты, но вместо того, чтобы они были не совсем белыми, они теперь имеют оттенок синего. т.е. кисть с линейным градиентом фона основана на цвете фона, который был применен к кнопке, а не перезаписывает его. Или для этого нужно определить отдельные стили. Я лично не могу понять, что это может быть достигнуто без какого-либо типа кода, т.е. создания градиентных кистей из одной кисти в разметке WPF.

т.е. кнопки, как показано ниже: синяя кнопка и серая / обычная кнопка

Google buttons 2

MyStyle

<Style x:Key="GoogleMiddleButton" TargetType="{x:Type Button}">
        <Setter Property="Background">
            <Setter.Value>
                <LinearGradientBrush StartPoint="0,1" EndPoint="0,0">
                    <GradientStop Color="#F1F1F1" Offset="0"/>
                    <GradientStop Color="#F5F5F5" Offset="1"/>
                </LinearGradientBrush>
            </Setter.Value>
        </Setter>
        <Setter Property="Foreground" Value="#666666"/>
        <Setter Property="FontFamily" Value="Arial"/>
        <Setter Property="FontSize" Value="13"/>
        <Setter Property="FontWeight" Value="Bold"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Button">
                    <Border Name="dropShadowBorder"
                        BorderThickness="0,0,0,1"
                        CornerRadius="1"
                        >
                        <Border.BorderBrush>
                            <SolidColorBrush Color="#00000000"/>
                        </Border.BorderBrush>
                    <Border Name="border" 
                    BorderThickness="{TemplateBinding BorderThickness}"
                    Padding="{TemplateBinding Padding}" 
                    CornerRadius="0" 
                    Background="{TemplateBinding Background}">
                        <Border.BorderBrush>
                            <SolidColorBrush Color="#D8D8D8"/>
                        </Border.BorderBrush>
                        <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
                                  VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                        </Border>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter Property="BorderBrush" TargetName="border">
                                <Setter.Value>
                                    <SolidColorBrush Color="#939393"/>
                                </Setter.Value>
                            </Setter>
                            <Setter Property="BorderBrush" TargetName="dropShadowBorder">
                                <Setter.Value>
                                    <SolidColorBrush Color="#EBEBEB"/>
                                </Setter.Value>
                            </Setter>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Foreground" Value="#333333"/>
            </Trigger>
            <Trigger Property="IsPressed" Value="True">
                <Setter Property="Background">
                    <Setter.Value>
                        <LinearGradientBrush StartPoint="0,1" EndPoint="0,0">
                            <GradientStop Color="#F1F1F1" Offset="1"/>
                            <GradientStop Color="#F5F5F5" Offset="0"/>
                        </LinearGradientBrush>
                    </Setter.Value>
                </Setter>
            </Trigger>
        </Style.Triggers>
    </Style>

шт. Если вы заметили какие-либо ошибки новичков в приведенном выше WPF, не стесняйтесь указывать на них мне.

6
задан JonWillis 15 August 2011 в 20:26
поделиться