C# 制造;“违约”;使用XAML在没有焦点的空文本框中显示的文本
我想创建一个文本框,如果它是 a) 空的 b) 失去了焦点 当用户进入文本框时,灰色的“默认”文本将出现 我尝试使用C# 制造;“违约”;使用XAML在没有焦点的空文本框中显示的文本,c#,wpf,xaml,C#,Wpf,Xaml,我想创建一个文本框,如果它是 a) 空的 b) 失去了焦点 当用户进入文本框时,灰色的“默认”文本将出现 我尝试使用ControlTemplate.Triggers执行此操作,但似乎找不到HasFocus属性 使用XAML执行此操作的最佳方法是什么?您只需使用的。 我根据您关于如何在项目中添加和使用库的评论编写了一个小指南 步骤1)右键单击项目中的引用,然后选择添加引用 步骤2)找到并添加dll文件WPFToolkit.Extended.dll 步骤3)最后,您需要添加XAML代码 <
ControlTemplate.Triggers
执行此操作,但似乎找不到HasFocus
属性
使用XAML执行此操作的最佳方法是什么?您只需使用的。
我根据您关于如何在项目中添加和使用库的评论编写了一个小指南
步骤1)右键单击项目中的引用
,然后选择添加引用
步骤2)找到并添加dll文件WPFToolkit.Extended.dll
步骤3)最后,您需要添加XAML
代码
<Window x:Class="WpfApplication2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:extToolkit="http://schemas.xceed.com/wpf/xaml/toolkit"
Title="MainWindow" Height="350" Width="525">
<Grid>
<extToolkit:WatermarkTextBox Watermark="Enter First Name" />
</Grid>
</Window>
然后您可以像这样在XAML
中简单地使用它
<extToolkit:WatermarkTextBox Watermark="Enter First Name" />
虽然重新发明车轮没有真正的好处,但看看如何做到这一点可能会很有趣。最简单的方法(纯XAML)是为
TextBox
创建一个ControlTemplate
,当TextBlock
未聚焦且不包含文本时,它覆盖在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>
multi-trigger
表示“如果Text
属性为空且文本框没有键盘焦点,则将可见性设置为可见”
如果您想使其更易于重用,则可以创建一个自定义控件,将其作为默认模板,并使用包含提示消息的依赖项属性它是一个自定义库,您可以从我链接到您的站点下载。是的,我做到了。但我必须引用它才能得到水印文本框。该库中有多个程序集。我应该引用哪一个?zip文件
ExtendedWPFToolkit_Binaries.zip
中只有一个dll文件,它应该包含一个名为WPFToolkit.Extended.dll
的dll文件,您可以在Visual Studio
中添加为引用。我把它和wpf工具包混淆了。谢谢np,很高兴你找到了解决方案我同意@Fuji并建议使用WatermarkTextBox
,但作为将来的参考,HasFocus
的等价物是IsKeyboardFocused
,我同意如果在简单的应用程序中很少使用纯XAML,那么它是不错的。我讨厌在项目中添加第三方DLL,除非经常使用。@fuji,了解这些东西是如何工作的很好@SteveGreatrex如何为不同的文本创建自定义控件例如text=“Your Prompt Here”,另一个文本框我需要文本为“You Prompt Here”。
<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>