Объединение ClearAll с водяным знаком на текстовом поле в WPF - PullRequest
0 голосов
/ 09 ноября 2011

Попробовав многочисленные способы заставить водяные знаки работать на меня, я наконец нашел тот, который был изменен @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 (по указанной выше ссылке) находятся в отдельных файлах классов.

1 Ответ

1 голос
/ 09 ноября 2011

Проблема не в вашем коде, а в выбранном текстовом поле с водяными знаками.Он обновляет водяной знак только тогда, когда он получает или теряет фокус, что является очевидным недостатком.Вам нужно будет найти лучшую реализацию.Вы пробовали один в расширенном наборе инструментов WPF ?

...