在浏览MSDN文档时,您可能会碰到这个gem:TextBox.Watermark。如何在Silverlight 4中使用TextBox.Watermark?
“太棒了!我一直想要一种内置的方式在我的文本框中添加水印!这非常棒,让我继续前进,并在XAML中设置!
<TextBox Watermark="This is my watermark" Margin="20"></TextBox>
不幸的是,如果你运行这个,你不会得到你所期望的:
和详细信息:
这是什么?那么,请仔细阅读MSDN文档:
没错。它在Silverlight 4中得到了支持,但它也说“不要在Silverlight 4应用程序中使用”。如果您确实使用它,则会收到System.NotImplemented异常。为了验证,这里是通过反射反编译属性的代码:
[EditorBrowsable(EditorBrowsableState.Never)]
public object Watermark
{
get
{
StubHelper.ThrowIfNotInDesignMode();
return base.GetValue(WatermarkProperty);
}
set
{
StubHelper.ThrowIfNotInDesignMode();
base.SetValue(WatermarkProperty, value);
}
}
在那里,它是 - 它抛出一个异常,它不是在设计模式的任何时间。这没有意义吗?为什么微软会这样做?
不幸的是,我还没有找到任何明确的答案,但是如果我不得不猜测这是因为微软正计划在未来版本(也许是v5)的TextBox控件上实现水印行为并且希望有效地保留此属性因此第三方控件创建者不会对TextBox进行子类化并创建自己的Watermark属性。 我知道至少有一个控件供应商ComponentOne拥有一个从TextBox继承并提供Watermark属性的控件。 对我来说,这似乎是微软阻止人们在他们自己的TextBox子类中使用这个属性名称的方式。
+1非常好的解决方案。顺便说一句,在Silverlight 5中工作正常。有趣的是,SL5 MSDN文档仍然具有与Watermark属性相同的冲突信息。 – 2012-09-05 17:13:40
还要注意,我稍微调整了代码,主要是为了解决设计时错误(如果未设置水印属性)。更新的代码添加为下面的新答案。 – 2012-09-05 17:53:02
你已经在构造函数中注册了事件,但是在卸载时你没有从它们注册(这很好),但是这带来了标签控制的问题,Tab控件将卸载它的内容并在适当的Tab被按下时加载,所以也许你应该注册到Loaded事件中的事件而不是构造函数。 – Sonosar 2013-07-17 08:15:01