WPF。文本框和密码框中的背景帮助文本

时间:2013-01-14 00:12:34

标签: wpf

我正在编写一个基于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>

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

2 个答案:

答案 0 :(得分:0)

如果我理解正确的话,你想要的是一个TextBox,它在空的时候会显示一些文字但没有聚焦,以便告诉用户如何处理它。为此,我建议创建一个继承自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的费用,它在资源方面太过分了,在某些情况下你可能会得到一个糟糕的渲染。希望这有帮助,尊重!

答案 1 :(得分:0)

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

 <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>
希望它有所帮助。