如果文本框没有键盘焦点和文本,则在其“内部”显示斜体灰色“在此输入”文本。如何实现?什么不起作用:
- 设置Text属性 - 这会搞乱数据绑定。 - 覆盖模板 - 这很混乱,而且已经被覆盖了。
最好的解决方案是尽可能多地使用XAML,尽可能少地使用C#。也许我可以创建一个附加属性来完成一些魔术?
- 设置Text属性 - 这会搞乱数据绑定。 - 覆盖模板 - 这很混乱,而且已经被覆盖了。
最好的解决方案是尽可能多地使用XAML,尽可能少地使用C#。也许我可以创建一个附加属性来完成一些魔术?
<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"/>
虽然不是最干净的解决方案,但您可以始终添加一个 TextBlock
覆盖在 TextBox
上,并在 TextBox
获得或失去焦点时更改其 Visible
属性。
这个方法有点恶心,但也算是创新吧?我能因此获得额外的奖励分吗?;-)