«ContentTemplate применяется к этому ContentPresenter посредством привязки после того, как он был назначен свойству ContentTemplate в UserControl». тогда как я могу обнаружить это изменение ?! По вашему собственному определению (и элементам управления) ContentTemplate IS установлен на элемент управления и, таким образом, привязка должна быть уже выполнена, так почему же FindName не работает? Почему эта привязка не была обновлена ​​к тому времени, когда я уже выполнил base.OnContentTemplateChanged? Позвольте мне спросить это по-другому. Как я могу получить текстовое поле сразу же, когда шаблон содержимого меняет визуальное дерево?

о ... это поставило меня в тупик. Я переопределил OnContentTemplateChanged в своем UserControl. Я проверяю, что значение, переданное для newContentTemplate, на самом деле равно this.ContentTemplate (да), когда я вызываю это ...

var textBox = this.ContentTemplate.FindName("EditTextBox", this);

... он выбрасывает следующее исключение ...

«Эта операция действительна только для элементов, к которым применен этот шаблон».

По словам комментатора в другом связанном вопросе, он сказал, что вы должны передать предъявителя контента для элемента управления, а не сам элемент управления, поэтому я попробовал это ...

var cp = FindVisualChild<ContentPresenter>(this);

var textBox = this.ContentTemplate.FindName("EditTextBox", cp);

где FindVisualChild - это просто вспомогательная функция, используемая в примере MSDN (см. ниже) для поиска связанного предъявителя контента. В то время как 'cp' найден, он также выдает ту же ошибку. Я в тупике!

Вот вспомогательная функция для справки ...

private childItem FindVisualChild<childItem>(DependencyObject obj)
    where childItem : DependencyObject
{
    for(int i = 0 ; i < VisualTreeHelper.GetChildrenCount(obj) ; i++)
    {
        DependencyObject child = VisualTreeHelper.GetChild(obj, i);
        if(child != null && child is childItem)
            return (childItem)child;
        else
        {
            childItem childOfChild = FindVisualChild<childItem>(child);
            if(childOfChild != null)
                return childOfChild;
        }
    }
    return null;
}

M

Ответы на вопрос(0)

Ваш ответ на вопрос