Попробовав многочисленные способы заставить водяные знаки работать на меня, я наконец нашел тот, который был изменен @Beej на этой странице:
Водяной знак / текст подсказки / заполнитель TextBox в WPF
Я поместил его в свой проект, и он отлично работает, за одним исключением. У меня есть несколько текстовых полей на каждой вкладке tabcontrol. Внизу есть кнопка очистки, которая работает, чтобы очистить все текстовые поля на вкладке. Кнопка очистки работает нормально, водяной знак работает нормально, но я не могу заставить их работать вместе. Окно загружается с установленными водяными знаками, и нажатие кнопки очистки очищает все поля, но водяные знаки не появляются снова, пока я не перейду через текстовые поля (каждое из них получает и теряет фокус). Я пробовал множество способов решить эту проблему Например, вызов метода для функции ShowWatermark в событии ButtonUp кнопки, но ничего не помогло ... Справка?!
Это метод кнопки «Очистить», который я использую:
public void ClearTextBoxes()
{
ChildControls ccChildren = new ChildControls();
foreach (object o in ccChildren.GetChildren(rvraDockPanel, 2))
{
if (o.GetType() == typeof(TextBox))
{
TextBox txt = (TextBox)o;
txt.Text = "";
}
if (o.GetType() == typeof(DigitBox))
{
DigitBox digit = (DigitBox)o;
digit.Text = "";
}
if (o.GetType() == typeof(PhoneBox))
{
PhoneBox phone = (PhoneBox)o;
phone.Text = "";
}
if (o.GetType() == typeof(DateBox))
{
DateBox date = (DateBox)o;
date.Text = "";
}
if (o.GetType() == typeof(TextBoxWatermarked))
{
TextBoxWatermarked water = (TextBoxWatermarked)o;
water.Text = "";
}
}
}
class ChildControls
{
private List<object> listChildren;
public List<object> GetChildren(Visual p_vParent, int p_nLevel)
{
if (p_vParent == null)
{
throw new ArgumentNullException("Element {0} is null!", p_vParent.ToString());
}
this.listChildren = new List<object>();
this.GetChildControls(p_vParent, p_nLevel);
return this.listChildren;
}
private void GetChildControls(Visual p_vParent, int p_nLevel)
{
int nChildCount = VisualTreeHelper.GetChildrenCount(p_vParent);
for (int i = 0; i <= nChildCount - 1; i++)
{
Visual v = (Visual)VisualTreeHelper.GetChild(p_vParent, i);
listChildren.Add((object)v);
if (VisualTreeHelper.GetChildrenCount(v) > 0)
{
GetChildControls(v, p_nLevel + 1);
}
}
}
}
И класс ChildControls, и класс TextboxWatermarked (по указанной выше ссылке) находятся в отдельных файлах классов.