2011-08-31 46 views
0

我已经做了BaseStyle,它看起来像这样:如何在WPF中为文本框和组合框应用相同的样式?

<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> 

但是,我不能添加像支持算法FMP =“{StaticResource的BaseStyle}”在ControlTemplate中做出如文本框在接收到焦点时获取不同的边框(请参阅BaseStyle中的IsFocused触发器),或者在验证被触发的情况下显示红色弯曲的拐角......我做错了什么?

回答

0

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

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

是不是?

0

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

您可以拥有一种基本样式来定义共享属性(如Padding,FontFamily等),而无需定义Template属性。然后制作两个样式:一个与TargetType设置为TextBox;另一个与TargetType设置为ComboBox。这些样式中的每一种都将基于您的基本样式,并为模板(以及两个控件之间不共享的其他属性)提供附加定义。

相关问题