Как я могу применить один и тот же стиль для текстового поля и комбинированного списка в WPF? - PullRequest
0 голосов
/ 31 августа 2011

Я создал BaseStyle, который выглядит следующим образом:

<Style x:Key="BaseStyle" TargetType="{x:Type Control}">
    <Setter Property="KeyboardNavigation.TabNavigation" Value="None" />
    <Setter Property="AllowDrop" Value="true" />
    <Setter Property="Background" Value="Transparent"></Setter>
    <Setter Property="HorizontalContentAlignment" Value="Stretch" />
    <Setter Property="VerticalContentAlignment" Value="Stretch" />
    <Setter Property="FontFamily" Value="Segoe UI" />
    <Setter Property="FontSize" Value="12" />
    <Setter Property="Padding" Value="8,5,3,3" />
    <Setter Property="BorderThickness" Value="0" />
    <Setter Property="SnapsToDevicePixels" Value="True" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Control}">
                <Grid>
                    <Border x:Name="BorderBase" Background="White" BorderThickness="1,1,1.4,1.4" BorderBrush="Silver" CornerRadius="4" />
                    <Label x:Name="TextPrompt" Content="{TemplateBinding Tag}" Visibility="Collapsed" Focusable="False"  Foreground="Silver"></Label>
                    <ScrollViewer Margin="0" x:Name="PART_ContentHost" Foreground="{DynamicResource OutsideFontColor}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsFocused" Value="True">
                        <Setter Property="BorderThickness" TargetName="BorderBase" Value="1,1,2.4,2.4"></Setter>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="Validation.ErrorTemplate">
        <Setter.Value>
            <ControlTemplate x:Name="InspectorErrorTemplate">
                <StackPanel Orientation="Vertical">
                    <Border BorderBrush="Red" BorderThickness="1" CornerRadius="4">
                        <AdornedElementPlaceholder Name="adornerPlaceholder"/>
                    </Border>
                </StackPanel>
            </ControlTemplate>
        </Setter.Value>
    </Setter>        
</Style>

И использовали его таким образом, чтобы применить его к текстовому полю, которое отлично работает:

<Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource BaseStyle}" />

Теперь я подумал, что могу просто использовать тот же стиль в текстовом поле комбинированного списка. Поэтому я подумал, что должен добавить что-то в этой части:

<ControlTemplate x:Key="ComboBoxTextBox" TargetType="{x:Type TextBox}">
    <Border x:Name="PART_ContentHost" Focusable="False" Background="{TemplateBinding Background}" />
    <ControlTemplate.Triggers>
    </ControlTemplate.Triggers>
</ControlTemplate>

Однако я не могу добавить что-то вроде BasedOn = "{StaticResource BaseStyle}" в ControlTemplate, чтобы сделать, например, текстовое поле, чтобы получить другую границу, когда он получает фокус (см. IsFocused Trigger в BaseStyle), или красный изогнутый угол в случае запуска проверки ... Что я делаю неправильно?

Ответы [ 2 ]

0 голосов
/ 31 августа 2011

Шаблон для TextBox принципиально отличается от шаблона для ComboBox. Так что вам придется использовать разные шаблоны.

У вас может быть один базовый стиль для определения общих свойств (например, Padding, FontFamily и т. Д.) Без определения свойства Template. Затем создайте еще два стиля: один с TargetType, установленным в TextBox; а другой с TargetType установлен на ComboBox. Каждый из этих стилей будет основан на вашем базовом стиле и будет иметь дополнительное определение для шаблона (и других свойств, которые не являются общими для двух элементов управления).

0 голосов
/ 31 августа 2011

Привет, вы работаете с другим цветом рамки для другого текстового поля, это единственная проблема здесь. Есть несколько других вариантов, но я считаю, что следующий вариант хорош.

Вы можете создать свой собственный UserControl, сохраняя внутри него TextBox. Вы можете добавить новое свойство DependencyProperty-BorderColor в свой UserControl. Так что согласно внутреннему значению свойства BorderColor вы можете изменить цвет рамки. Так что здесь вам не нужно беспокоиться о множественном стиле или любом наследовании.

Не правда ли?

...