如何在WPF中为textbox和combobox应用相同的样式?

时间:2011-08-31 06:54:41

标签: wpf xaml combobox textbox styles

我制作了一个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>

但是,我无法在ControlTemplate中添加类似BasedOn =“{StaticResource BaseStyle}”的内容来制作例如文本框在接收到焦点时获取不同的边框(请参阅BaseStyle中的IsFocused Trigger),或者在触发验证的情况下获得红色弯角...我做错了什么?

2 个答案:

答案 0 :(得分:0)

您好,您正在为不同的文本框使用不同的边框颜色,这是唯一的问题。还有其他几个选项,但我觉得以下选项很好。

您可以创建自己的UserControl,在其中保留TextBox。您可以在UserControl中添加新的DependencyProperty-BorderColor属性。因此,根据BorderColor属性值,您可以在内部更改边框的颜色。所以在这里你不必担心多个Style或任何继承。

不是吗?

答案 1 :(得分:0)

TextBox的模板与ComboBox的模板根本不同。所以你必须有不同的模板。

您可以使用一种基本样式来定义共享属性(例如PaddingFontFamily等),而无需定义Template属性。然后再创建两个样式:一个TargetType设置为TextBox;另一个TargetType设置为ComboBox。这些样式中的每一个都将基于您的基本样式,并具有模板的其他定义(以及两个控件之间不共享的其他属性)。