2

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

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

4

2 回答 2

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>

希望能帮助到你。

于 2013-01-14T03:05:07.243 回答
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 的费用,这在资源方面是过度的,并且在某些情况下你可能会得到一个糟糕的渲染。希望这会有所帮助,问候!

于 2013-01-14T00:47:55.453 回答