“太棒了!我一直想要一个内置的方法来在文本框上加水印!这很好,让我去设置XAML!”
<TextBox Watermark="This is my watermark" Margin="20"></TextBox>
很不幸,如果你运行这个代码,你将得到一个出乎意料的结果:
具体细节如下:
这是什么?好的,仔细看一下MSDN文档:
[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子类上使用此属性名称的方法。