c# - 使用 XAML 使 "default"文本显示在没有焦点的空文本框中

标签 c# wpf xaml

我想创建一个文本框,如果是的话,里面会出现一个灰色的“默认”文本

a) 空

b) 失去焦点

当用户输入文本框时,灰色的“默认”文本应该消失。

我已尝试使用 ControlTemplate.Triggers 执行此操作,但我似乎找不到 HasFocus 属性。

使用 XAML 执行此操作的最佳方法是什么?

最佳答案

虽然重新发明轮子并没有真正的好处,但看看如何做到这一点可能会很有趣。执行此操作的最简单方法(在纯 XAML 中)是为 TextBox 创建一个 ControlTemplate,它在未获得焦点时覆盖 TextBlock,并且不包含文字:

<ControlTemplate TargetType="TextBox">
<Grid>
    <TextBox Text="{Binding Text, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}, UpdateSourceTrigger=PropertyChanged}" />
    <TextBlock HorizontalAlignment="Center"
                VerticalAlignment="Center"
                Text="Your Prompt Here"
                Margin="5,0,5,0"
                Foreground="#FF808080"
                FontStyle="Italic"
                IsHitTestVisible="False"
                x:Name="UserMessage"
                Visibility="Hidden"/>
</Grid>
<ControlTemplate.Triggers>
    <MultiTrigger>
        <MultiTrigger.Conditions>
            <Condition Property="Text" Value=""/>
            <Condition Property="IsKeyboardFocusWithin" Value="False"/>
            </MultiTrigger.Conditions>
        <Setter Property="Visibility" TargetName="UserMessage" Value="Visible"/>
    </MultiTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>

MultiTrigger 表示“如果 Text 属性为空且 TextBox 没有键盘焦点,则将 Visibility 设置为 Visible”

如果你想让它更可重用,那么你可以创建一个自定义控件,将其作为默认模板,并使用包含提示消息的依赖属性

关于c# - 使用 XAML 使 "default"文本显示在没有焦点的空文本框中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10428230/

相关文章:

c#存储库模式 : One repository per subclass?

wpf - ControlTemplate 中的 UserControl

xaml - Xamarin 表单 - 对 ObservableCollection 的更改不会更新 View

Wpf 样式 : Binding to Child Property via ElementName

c# - 将 VB Linq 转换为 C#

c# - 在 ASP.NET MVC 中通过 jQuery 提交表单时传递参数

c# - 帮助将小型 C# WCF 应用程序转换为 Visual Basic(第 2 部分)

wpf - 没有初始 shell 的 Prism 应用程序

wpf - 单击某些其他控件时不会引发 TextBox LostFocus

wpf - 从 XAML 初始化排序集合