Как реализован Storyboard.TargetName? - PullRequest
0 голосов
/ 13 января 2012

Я создаю пользовательскую подсказку, которая должна получить ссылку на другой элемент управления. Это очень похоже на то, как Storyboard.TargetName будет работать. Теперь я прокрутил свою собственную реализацию о том, как получить ссылку на цель, например (обратите внимание, что моя цель всегда будет родителем всплывающей подсказки):

public object FindTarget(string targetName)
{
    var target = default(object);
    FrameworkElement item = this;
    while ((item = item.Parent as FrameworkElement) != null && target == null)
        target = item.FindName(targetName);
    return target;
}

Мой вопрос: есть ли способ сделать это, встроенный в фреймворк? Похоже, что это достаточно распространенная задача, что это было бы.

Редактировать

Оказывается, что вышеприведенный алгоритм на самом деле не работает для всплывающих подсказок, потому что их свойство Parent всегда равно null. Я предполагаю, что всплывающие подсказки основаны на всплывающих окнах, и поэтому родительский элемент имеет значение null.

1 Ответ

0 голосов
/ 13 января 2012

Вы можете использовать методы расширения, чтобы сделать его видимым из любого места:

public static object GetElementByName(this FrameworkElement baseElement, string name) 
    {
        object target = null;

        FrameworkElement item = baseElement;
        while ((item = item.Parent as FrameworkElement) != null && target == null)
            target = item.FindName(name);

        return target;
    }

После этого вы сможете вызывать этот метод в любом FrameworkElement.Хотя вам следует учитывать тот факт, что FindName не будет работать для имен, определенных в шаблонах.

...