“太棒了!我一直想要一种内置的方法在我的文本框上做水印!这很棒,让我继续在XAML中设置它!”
<TextBox Watermark="This is my watermark" margin="20"></TextBox>
不幸的是,如果你运行它,你将得不到你所期望的:
细节:
这是什么?好吧,仔细查看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);}}
它就是 – 它在任何时候都没有处于设计模式时抛出异常.这没有道理吗?为什么微软会这样做?
不幸的是我还没有找到任何确定的答案,但是如果我不得不猜测是因为微软计划在未来的版本(也许是v5)中在TextBox控件上实现Watermark行为,并希望有效地保留这个属性,以便第三方控制创建者不会将TextBox子类化并创建自己的Watermark属性.
我知道至少有一个控件供应商ComponentOne,它拥有一个继承自TextBox并提供Watermark属性的控件.
对我来说,似乎这是微软阻止人们在他们自己的TextBox子类上使用这个属性名称的方式.
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); } }
XAML:
xmlns:watertext="clr-namespace:SilverlightClasslibrary1;assembly=SilverlightClasslibrary1" <watertext:WatermarkTextBox Watermark="WElcome" margin="150,115,120,166"></watertext:WatermarkTextBox>总结
以上是内存溢出为你收集整理的.net – 如何在Silverlight 4中使用TextBox.Watermark?全部内容,希望文章能够帮你解决.net – 如何在Silverlight 4中使用TextBox.Watermark?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)