Unk*_*own 8 .net silverlight-4.0
在浏览MSDN文档时,您可能会遇到这样的gem:TextBox.Watermark.
"太棒了!我一直想要一种内置的方法在我的文本框上做水印!这很棒,让我继续在XAML中设置它!"
<TextBox Watermark="This is my watermark" Margin="20"></TextBox>
Run Code Online (Sandbox Code Playgroud)
不幸的是,如果你运行它,你将得不到你所期望的:

细节:

这是什么?好吧,仔细查看MSDN文档:

那就对了.Silverlight 4支持它,但它也说"不要在Silverlight 4应用程序中使用".如果您使用它,则会收到System.NotImplemented异常.要验证,这里是通过Reflector反编译的属性的代码:
[EditorBrowsable(EditorBrowsableState.Never)]
public object Watermark
{
get
{
StubHelper.ThrowIfNotInDesignMode();
return base.GetValue(WatermarkProperty);
}
set
{
StubHelper.ThrowIfNotInDesignMode();
base.SetValue(WatermarkProperty, value);
}
}
Run Code Online (Sandbox Code Playgroud)
它就是 - 它在任何时候都没有处于设计模式时抛出异常.这没有道理吗?为什么微软会这样做?
不幸的是我还没有找到任何确定的答案,但是如果我不得不猜测是因为微软计划在未来的版本(也许是v5)中在TextBox控件上实现Watermark行为,并希望有效地保留这个属性,以便第三方控制创建者不会将TextBox子类化并创建自己的Watermark属性.我知道至少有一个控件供应商ComponentOne,它拥有一个继承自TextBox并提供Watermark属性的控件.对我来说,似乎这是微软劝阻人们在自己的TextBox子类上使用这个属性名称的方式.
小智 14
创建一个类库项目.添加类文件使用以下代码.....之后添加在此项目中的dll.
public class WatermarkTextBox : TextBox
{
private bool displayWatermark = true;
private bool hasFocus = false;
public WatermarkTextBox()
{
this.GotFocus += new RoutedEventHandler(WatermarkTextBox_GotFocus);
this.LostFocus += new RoutedEventHandler(WatermarkTextBox_LostFocus);
this.TextChanged += new TextChangedEventHandler(WatermarkTextBox_TextChanged);
this.Unloaded += new RoutedEventHandler(WatermarkTextBox_Unloaded);
}
private void WatermarkTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
if (!hasFocus && Text == "")
{
setMode(true);
displayWatermark = true;
this.Text = Watermark;
}
}
private void WatermarkTextBox_Unloaded(object sender, RoutedEventArgs e)
{
this.GotFocus -= WatermarkTextBox_GotFocus;
this.LostFocus -= WatermarkTextBox_LostFocus;
this.Unloaded -= WatermarkTextBox_Unloaded;
this.TextChanged -= WatermarkTextBox_TextChanged;
}
private void WatermarkTextBox_GotFocus(object sender, RoutedEventArgs e)
{
hasFocus = true;
if (displayWatermark)
{
setMode(false);
this.Text = "";
}
}
private void WatermarkTextBox_LostFocus(object sender, RoutedEventArgs e)
{
hasFocus = false;
if (this.Text == "")
{
displayWatermark = true;
setMode(true);
this.Text = Watermark;
}
else
{
displayWatermark = false;
}
}
private void setMode(bool watermarkStyle)
{
if (watermarkStyle)
{
this.FontStyle = FontStyles.Italic;
this.Foreground = new SolidColorBrush(Colors.Gray);
}
else
{
this.FontStyle = FontStyles.Normal;
this.Foreground = new SolidColorBrush(Colors.Black);
}
}
public new string Watermark
{
get { return GetValue(WatermarkProperty) as string; }
set { SetValue(WatermarkProperty, value); }
}
public static new readonly DependencyProperty WatermarkProperty =
DependencyProperty.Register("Watermark", typeof(string), typeof(WatermarkTextBox), new PropertyMetadata(watermarkPropertyChanged));
private static void watermarkPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
WatermarkTextBox textBox = obj as WatermarkTextBox;
if (textBox.displayWatermark)
{
textBox.Text = e.NewValue.ToString();
textBox.setMode(true);
}
}
Run Code Online (Sandbox Code Playgroud)
XAML:
xmlns:watertext="clr-namespace:SilverlightClassLibrary1;assembly=SilverlightClassLibrary1"
<watertext:WatermarkTextBox Watermark="WElcome" Margin="150,115,120,166"></watertext:WatermarkTextBox>
Run Code Online (Sandbox Code Playgroud)