首页 > 解决方案 > 如何修复“样式化文本框中的文本不可见”

问题描述

我正在尝试使用 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}" />

标签: wpfxaml

解决方案


以下是您的Style,但已修复。
它现在包含具有强制命名的强制部分:名为PART_ContentHost的内容主机。
您还应该使用 . 将模板的控件(在本例中为Border属性)绑定到模板化父级(TextBox)的适当属性TemplateBinding。这使您可以直接在 上设置这些值(例如BackgroundBorderThicknessControl

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

我删除GridControlTemplate. 元素越少,性能越好。

评论

某些控件具有强制性模板元素(部分),这些元素必须是 的一部分ContorlTemplate并具有特殊名称。当这些部分丢失或名称与所需名称不匹配时,模板化控件的功能可能会被破坏。要了解部件及其名称,TextBox请访问TextBox Parts。要了解所有 WPF 控件的命名部分,请访问Control Styles and Templates。此链接还包含实际默认样式和模板的示例。

获取所需模板部分的另一种方法是选择要模板化的控件,然后打开 XAML 设计器视图。右键单击选定的控件并选择Edit Template。在弹出窗口中选择Edit a Copy。将打开一个对话框。在这里,您可以为提取的模板命名并设置提取的模板将移动到的位置。现在您可以编辑这个已经包含所有必需部分的模板。


推荐阅读