wpf - 如何修复“样式化文本框中的文本不可见”
问题描述
我正在尝试使用 xaml 向 TextBox 添加样式,但文本不可见。有人可以指出我可以将前景设置为白色的地方吗?我应该改用模板吗?
我尝试调整各种元素,但没有运气。样式如下
<Style x:Key="RoundedTxtBox" TargetType="{x:Type TextBox}">
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="Padding" Value="1"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TextBox}">
<Grid x:Name="TxtBoxgrid">
<Border x:Name="TxtBoxborder" CornerRadius="8" BorderBrush="Black" BorderThickness="2">
<Border.Background>
<RadialGradientBrush GradientOrigin="0.496,1.052">
<RadialGradientBrush.RelativeTransform>
<TransformGroup>
<ScaleTransform CenterX="0.5" CenterY="0.5"
ScaleX="1.5" ScaleY="1.5"/>
<TranslateTransform X="0.02" Y="0.3"/>
</TransformGroup>
</RadialGradientBrush.RelativeTransform>
<GradientStop Offset="1" Color="#00000000"/>
<GradientStop Offset="0.3" Color="#FFFFFFFF"/>
</RadialGradientBrush>
</Border.Background>
</Border>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsFocused" Value="True">
<Setter Property="Background" TargetName="TxtBoxborder">
<Setter.Value>
<RadialGradientBrush GradientOrigin="0.496,1.052">
<RadialGradientBrush.RelativeTransform>
<TransformGroup>
<ScaleTransform CenterX="0.5" CenterY="0.5" ScaleX="1.5" ScaleY="1.5"/>
<TranslateTransform X="0.02" Y="0.3"/>
</TransformGroup>
</RadialGradientBrush.RelativeTransform>
<GradientStop Color="#00000000" Offset="1"/>
<GradientStop Color="#FF303030" Offset="0.3"/>
</RadialGradientBrush>
</Setter.Value>
</Setter>
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="BorderBrush" TargetName="TxtBoxborder" Value="#FFE6182B"/>
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Opacity" TargetName="TxtBoxgrid" Value="0.25"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Button Style="{DynamicResource RoundedTxtBox}" />
解决方案
以下是您的Style
,但已修复。
它现在包含具有强制命名的强制部分:名为PART_ContentHost的内容主机。
您还应该使用 . 将模板的控件(在本例中为Border
属性)绑定到模板化父级(TextBox
)的适当属性TemplateBinding
。这使您可以直接在 上设置这些值(例如Background
或BorderThickness
)Control
:
<Style TargetType="TextBox">
<Setter Property="Background">
<Setter.Value>
<RadialGradientBrush GradientOrigin="0.496,1.052">
<RadialGradientBrush.RelativeTransform>
<TransformGroup>
<ScaleTransform CenterX="0.5" CenterY="0.5" ScaleX="1.5" ScaleY="1.5"/>
<TranslateTransform X="0.02" Y="0.3"/>
</TransformGroup>
</RadialGradientBrush.RelativeTransform>
<GradientStop Offset="1" Color="#00000000"/>
<GradientStop Offset="0.3" Color="#FFFFFFFF"/>
</RadialGradientBrush>
</Setter.Value>
</Setter>
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="Padding" Value="1"/>
<Setter Property="BorderBrush" Value="Black" />
<Setter Property="BorderThickness" Value="2" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="TextBox">
<Border x:Name="TxtBoxBorder"
CornerRadius="8"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
Padding="{TemplateBinding Padding}">
<!-- The required part with the required name -->
<ScrollViewer x:Name="PART_ContentHost"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsFocused" Value="True">
<Setter Property="Background" TargetName="TxtBoxBorder">
<Setter.Value>
<RadialGradientBrush GradientOrigin="0.496,1.052">
<RadialGradientBrush.RelativeTransform>
<TransformGroup>
<ScaleTransform CenterX="0.5" CenterY="0.5" ScaleX="1.5" ScaleY="1.5"/>
<TranslateTransform X="0.02" Y="0.3"/>
</TransformGroup>
</RadialGradientBrush.RelativeTransform>
<GradientStop Color="#00000000" Offset="1"/>
<GradientStop Color="#FF303030" Offset="0.3"/>
</RadialGradientBrush>
</Setter.Value>
</Setter>
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="BorderBrush" TargetName="TxtBoxBorder" Value="#FFE6182B"/>
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Opacity" TargetName="TxtBoxBorder" Value="0.25"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
我删除Grid
了ControlTemplate
. 元素越少,性能越好。
评论
某些控件具有强制性模板元素(部分),这些元素必须是 的一部分ContorlTemplate
并具有特殊名称。当这些部分丢失或名称与所需名称不匹配时,模板化控件的功能可能会被破坏。要了解部件及其名称,TextBox
请访问TextBox Parts。要了解所有 WPF 控件的命名部分,请访问Control Styles and Templates。此链接还包含实际默认样式和模板的示例。
获取所需模板部分的另一种方法是选择要模板化的控件,然后打开 XAML 设计器视图。右键单击选定的控件并选择Edit Template。在弹出窗口中选择Edit a Copy。将打开一个对话框。在这里,您可以为提取的模板命名并设置提取的模板将移动到的位置。现在您可以编辑这个已经包含所有必需部分的模板。
推荐阅读
- python-3.x - Hierarchical Groupby 然后按 Python 中的另一列计算值
- arrays - 在golang中将矩阵打印为字符串
- selenium-webdriver - Cucumber - 使用非静态 webdriver 时出现 NullPointerexception
- java - Java:抑制警告“X 被标记为不稳定”
- vba - 如何将表 1 中的值添加到表 2 单元格中的值,然后在表 2 中显示结果?
- json - 为什么 JSONResult 将 Camel 大小写属性名称转换为小写?
- lua - Lua - 遍历表的问题
- opencv - NVIDIA Jetson TX2 上的 OpenCV 3 测试失败(与 gcc-7 与 gcc < 7 相关)
- android - 路径存储在数据库中现在点击播放它怎么做
- python - 如何只将一个参数传递给odeint?