在瀏覽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