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>
请告诉我问题出在哪里?哦,还有一个问题:是否可以使用类似的方法在密码盒中输出背景文本?谢谢你!
如果我理解正确的话,您想要的是一个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>
希望能有所帮助。