如何修复“文本在样式文本框中不可见”

时间:2019-07-31 23:50:15

标签: wpf xaml

我正在尝试使用xaml向文本框添加样式,但是文本不可见。有人可以指出我可以将前景设置为白色的地方吗?我应该改为使用模板吗?

我尝试调整各种元素,但是没有运气。样式在下方

<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}" />

1 个答案:

答案 0 :(得分:0)

以下是您的Style,但已解决。
现在,它包含带有强制性命名的强制性部分:名为 PART_ContentHost 的内容主机。
您还应该使用Border将模板的控件(在这种情况下为TextBox属性)绑定到模板化父对象(TemplateBinding)的适当属性。这样一来,您就可以直接在Background上设置这些值(例如BorderThicknessControl):

<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设计器视图。右键单击所选控件,然后选择编辑模板。在弹出窗口中,选择编辑副本。将打开一个对话框。在这里,您可以为提取的模板命名,并设置提取的模板将移动到的位置。现在,您可以编辑已经包含所有必需部分的模板。