WPF.背景帮助文本在文本框和密码框

本文关键字:文本 密码 背景 WPF 帮助 | 更新日期: 2023-09-27 17:53:00

我正在编写一个基于wpf的应用程序,我遇到了一个问题。我已经寻找了几个星期的答案,但仍然找不到解决办法。问题是:我不能用提示显示背景文本。我正在使用我自己的写作风格,并试图通过触发器显示文本。下面是我编写的代码示例:

<Style TargetType="{x:Type TextBox}" x:Key="DCTextBox">           
            <Setter Property="OverridesDefaultStyle" Value="True"/>
            <Setter Property="FontSize" Value="14"/>
            <Setter Property="Foreground" Value="#21346b"/>
            <Setter Property="FontFamily" Value="Fonts/#BankGothic Md BT"/>            
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type TextBox}">
                        <Border CornerRadius="5" BorderThickness="6" BorderBrush="#21346b" Background="White" >
                            <ScrollViewer Margin="0" x:Name="PART_ContentHost"/>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter> 
            <Style.Resources>
                    <VisualBrush x:Key="HelpBrush" Opacity="0.4" Stretch="None" AlignmentX="Left" >
                        <VisualBrush.Visual>
                            <TextBlock FontStyle="Italic" Text="Type or select from list" Background="Black"/>
                        </VisualBrush.Visual>
                    </VisualBrush>
            </Style.Resources>         
            <Style.Triggers>
                <Trigger Property="Text" Value="{x:Null}">
                    <Setter Property="Control.Background" Value="{StaticResource HelpBrush}"/>
                </Trigger>
                <Trigger Property="Text" Value="">
                    <Setter Property="Control.Background" Value="{StaticResource HelpBrush}"/>
                </Trigger>
            </Style.Triggers> 
        </Style>

请告诉我问题出在哪里?哦,还有一个问题:是否可以使用类似的方法在密码盒中输出背景文本?谢谢你!

WPF.背景帮助文本在文本框和密码框

如果我理解正确的话,您想要的是一个TextBox,它在空且未聚焦时显示一些文本,以便告诉用户如何处理它。对于这一点,我建议创建一个新的控件继承自TextBox,所以当你设置你的风格,你不影响所有的文本框在你的应用程序。添加一个DependencyProperty到它,这样你就可以设置帮助文本在XAML。

public class MyTextBox : TextBox
{
    public static DependencyProperty LabelTextProperty =
        DependencyProperty.Register(
            "LabelText",
            typeof(string),
            typeof(MyTextBox));
 }

定义你的风格,在本例中我这样做(我只发布相关的部分,你可以让它看起来更漂亮):

 <Style x:Key="{x:Type local:MyTextBox}" TargetType="{x:Type local:MyTextBox}">
 <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:MyTextBox}">
     <ControlTemplate.Triggers>
                    <Trigger Property="IsKeyboardFocusWithin" Value="True">
                        <Setter Property="Visibility" TargetName="LabelText" Value="Hidden" />
                    </Trigger>
                    <Trigger Property="HasText" Value="True">
                        <Setter Property="Visibility" TargetName="LabelText" Value="Hidden" />
                    </Trigger>
     </ControlTemplate.Triggers>
           </ControlTemplate>
 </Setter.Value>
 </Style>

你可以这样使用:

<Local:MyTextBox LabelText="This is the tip for the user" Text="{Binding SomeProperty}"/>

关于密码盒,我还没有试过,但应该没问题。如果LabelText显示为"xxxxxxxxx",我相信你会找到一个解决方案(出乎意料,我可以想到在PasswordBox中创建一个TextBlock类型的DependencyProperty,用Tip字符串设置其内容,并隐藏/显示整个内容)。

最后一个建议:当你只是想显示一个文本时,不要花太多的钱使用VisualBrush,这是多余的资源,在某些情况下你可能会得到一个糟糕的渲染。希望这对你有帮助,谢谢!

我做了一些修改,它对我来说很好。

 <Style TargetType="{x:Type TextBox}" x:Key="DCTextBox">
        <Setter Property="FontSize" Value="14"/>
        <Setter Property="Foreground" Value="#21346b"/>
        <Setter Property="FontFamily" Value="Fonts/#BankGothic Md BT"/>
        <Style.Resources>
            <VisualBrush x:Key="HelpBrush" Opacity="0.4" Stretch="None" AlignmentX="Left" >
                <VisualBrush.Visual>
                    <TextBlock FontStyle="Italic" Text="Type or select from list" Foreground="Black"/>
                </VisualBrush.Visual>
            </VisualBrush>
        </Style.Resources>
        <Style.Triggers>
            <Trigger Property="Text" Value="{x:Null}">
                <Setter Property="Background" Value="{StaticResource HelpBrush}"/>
            </Trigger>
            <Trigger Property="Text" Value="">
                <Setter Property="Background" Value="{StaticResource HelpBrush}"/>
            </Trigger>
        </Style.Triggers>
    </Style>

希望能有所帮助。