如何在WPF TextBox中添加“在此处输入”消息?

3
如果文本框没有键盘焦点和文本,则在其“内部”显示斜体灰色“在此输入”文本。如何实现?什么不起作用:
- 设置Text属性 - 这会搞乱数据绑定。 - 覆盖模板 - 这很混乱,而且已经被覆盖了。
最好的解决方案是尽可能多地使用XAML,尽可能少地使用C#。也许我可以创建一个附加属性来完成一些魔术?
5个回答

4
你需要的是所谓的“水印”。我不熟悉WPF,但在“谷歌”上搜索“WPF和水印”会返回大量结果。请参考WPF & Watermark

在WPF/Silverlight/等等中,水印文本非常流行,有数百种解决方案可供选择... - Anvaka

1
创建一个文本框样式。这是添加“水印”到文本框的最简单方法之一。代码创建了一个简单的样式并将其绑定到文本框。
(代码摘自:http://social.msdn.microsoft.com/Forums/vstudio/en-US/d565c79e-6b4a-44e2-a566-a4a622eab22f/how-to-set-watermark-for-textbox-in-simple-way?forum=wpf
<Window.Resources>
    <Style x:Key="MyWaterMarkStyle" TargetType="{x:Type TextBox}">           
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TextBox}">
                    <Grid>
                        <Border Background="White" BorderBrush="#FF7D8683" BorderThickness="1"/>
                        <ScrollViewer x:Name="PART_ContentHost" Margin="5,0,0,0" VerticalAlignment="Center" />
                        <Label Margin="5,0,0,0" x:Name="WaterMarkLabel" Content="{TemplateBinding Tag}" VerticalAlignment="Center"
                           Visibility="Collapsed" Foreground="Gray" FontFamily="Arial"/>
                    </Grid>
                    <ControlTemplate.Triggers>
                        <MultiTrigger>
                            <MultiTrigger.Conditions>
                                <Condition Property="Text" Value=""/>
                            </MultiTrigger.Conditions>
                            <Setter Property="Visibility" TargetName="WaterMarkLabel" Value="Visible"/>
                        </MultiTrigger>
                        <Trigger Property="IsEnabled" Value="False">
                            <Setter Property="Foreground" Value="DimGray"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>

...

<TextBox Style="{StaticResource MyWaterMarkStyle}" Height="25" Tag="Water mark"/>

1
到目前为止,我看到的最好的解决方案是来自Kevin的WPF Bag-o-Tricks libraryInfoTextBox。去看看吧。

0
我建议您使用Syncfusion来进行WPF编程。 其中包含SfTextBoxExt,支持水印和其他功能。

点击这里查看


0

虽然不是最干净的解决方案,但您可以始终添加一个 TextBlock 覆盖在 TextBox 上,并在 TextBox 获得或失去焦点时更改其 Visible 属性。

这个方法有点恶心,但也算是创新吧?我能因此获得额外的奖励分吗?;-)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接