【发布时间】:2016-06-21 20:02:09
【问题描述】:
我在一个名为 CustomControls 的新 WPF 项目中完成了以下操作。
第 1 步:创建一个Controls 文件夹。向其中添加了一个名为 WatermarkTextBox.cs 的新文件。在文件中添加了这段 C# 代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
namespace Controls
{
public class WatermarkTextBox : TextBox
{
public static readonly DependencyProperty WatermarkProperty = DependencyProperty.Register("Watermark", typeof(String), typeof(WatermarkTextBox), new PropertyMetadata(String.Empty));
public String Watermark
{
get { return (String)GetValue(WatermarkProperty); }
set { SetValue(WatermarkProperty, value); }
}
}
}
第 2 步:在 Controls 文件夹中,添加一个名为 WatermarkTextBox.xaml 的新文件。在文件中添加了此 XAML:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:controls="clr-namespace:Controls">
<Style TargetType="{x:Type controls:WatermarkTextBox}" BasedOn="{StaticResource {x:Type TextBox}}">
<Style.Resources>
<VisualBrush x:Key="WatermarkBrush" AlignmentX="Left" AlignmentY="Center" Stretch="None">
<VisualBrush.Visual>
<Label Content="{Binding Watermark}" FontFamily="Segoe UI" FontSize="20" Foreground="LightGray" Padding="5" />
</VisualBrush.Visual>
</VisualBrush>
</Style.Resources>
<Style.Triggers>
<Trigger Property="Text" Value="{x:Static sys:String.Empty}">
<Setter Property="Background" Value="{StaticResource WatermarkBrush}" />
</Trigger>
<Trigger Property="Text" Value="{x:Null}">
<Setter Property="Background" Value="{StaticResource WatermarkBrush}" />
</Trigger>
<Trigger Property="IsKeyboardFocused" Value="True">
<Setter Property="Background" Value="White" />
</Trigger>
</Style.Triggers>
</Style>
</ResourceDictionary>
第 3 步:创建一个Themes 文件夹。向其中添加一个名为 Generic.xaml 的新文件。在文件中添加此 XAML:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/CustomControls;component/Controls/WatermarkTextBox.xaml" />
</ResourceDictionary.MergedDictionaries>
第 4 步:在MainWindow.xaml:添加xmlns:controls="clr-namespace:Controls",并定义一个新的WatermarkTextBox:
<controls:WatermarkTextBox x:Name="Hostname" Height="40" FontFamily="Segoe UI" FontSize="20" VerticalContentAlignment="Center" Watermark="Hello, world."/>
我看到了这个自定义控件所基于的文本框,但是我没有看到我为它扩展的水印。为什么会这样,我该如何渲染我的水印?附言我应该注意,如果我将 XAML 中的 {Binding Watermark} 更改为硬编码字符串,水印就会出现。另外,如果我调试我的代码,我会看到 WatermarkTextBox 选择了正确的值......那么为什么 XAML 没有显示它?怎么会有人调试这些东西?
【问题讨论】: