Если вместо того, чтобы видимость водяного знака зависела от состояния фокуса элемента управления, вы хотите, чтобы он зависел от того, ввел ли пользователь какой-либо текст, вы можете обновить ответ Джона Мычека (с OnWatermarkChanged
вниз) до
static void OnWatermarkChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) {
var textbox = (TextBox)d;
textbox.Loaded += UpdateWatermark;
textbox.TextChanged += UpdateWatermark;
}
static void UpdateWatermark(object sender, RoutedEventArgs e) {
var textbox = (TextBox)sender;
var layer = AdornerLayer.GetAdornerLayer(textbox);
if (layer != null) {
if (textbox.Text == string.Empty) {
layer.Add(new WatermarkAdorner(textbox, GetWatermark(textbox)));
} else {
var adorners = layer.GetAdorners(textbox);
if (adorners == null) {
return;
}
foreach (var adorner in adorners) {
if (adorner is WatermarkAdorner) {
adorner.Visibility = Visibility.Hidden;
layer.Remove(adorner);
}
}
}
}
}
Это имеет больше смысла, если ваше текстовое поле получает фокус автоматически при отображении формы или при привязке данных к свойству Text.
Также, если ваш водяной знак всегда является просто строкой, и вам нужно, чтобы стиль водяного знака соответствовал стилю текстового поля, то в Adorner выполните:
contentPresenter = new ContentPresenter {
Content = new TextBlock {
Text = (string)watermark,
Foreground = Control.Foreground,
Background = Control.Background,
FontFamily = Control.FontFamily,
FontSize = Control.FontSize,
...
},
...
}