我制作了一个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),或者在触发验证的情况下获得红色弯角...我做错了什么?
答案 0 :(得分:0)
您好,您正在为不同的文本框使用不同的边框颜色,这是唯一的问题。还有其他几个选项,但我觉得以下选项很好。
您可以创建自己的UserControl,在其中保留TextBox。您可以在UserControl中添加新的DependencyProperty-BorderColor属性。因此,根据BorderColor属性值,您可以在内部更改边框的颜色。所以在这里你不必担心多个Style或任何继承。
不是吗?
答案 1 :(得分:0)
TextBox的模板与ComboBox的模板根本不同。所以你必须有不同的模板。
您可以使用一种基本样式来定义共享属性(例如Padding
,FontFamily
等),而无需定义Template
属性。然后再创建两个样式:一个TargetType
设置为TextBox;另一个TargetType
设置为ComboBox
。这些样式中的每一个都将基于您的基本样式,并具有模板的其他定义(以及两个控件之间不共享的其他属性)。