Как я могу получить родительский всплывающий элемент для UIElement? - PullRequest
2 голосов
/ 05 января 2010

У меня есть два вопроса по разметке ниже:

<Popup>
    <Button x:Name="button"/>
</Popup>
  1. Почему VisualTreeHelper.GetParent(button) возвращает ноль?
  2. Как мне получить родителя Popup для UIElement?

Ответы [ 5 ]

5 голосов
/ 05 октября 2010

Вместо того чтобы проходить через VisualTree, вы только что попробовали цикл while, чтобы пройти .Parents для элементов?

    private void TryClosePopupParent(object o)
    {
        while (o != null)
        {
            Popup p = (o as Popup);
            if(p == null)
            {
                o = (o as FrameworkElement).Parent;
            }
            else 
            {
                p.IsOpen = false;
                break;
            }
        }
    }

Я никогда не проверял это на том, что не имеет PopUp в качестве родителя, но это сработало для меня.

3 голосов
/ 05 января 2010
  1. Поскольку Button добавляется в визуальное дерево только при отображении всплывающего окна.

  2. Хм ... хитрый ...

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

В следующем предположении предполагается, что ваше всплывающее окно определено в XAML UserControl, поэтому, хотя его дочерний элемент может отсутствовать в визуальном дереве, элемент управления примитивом всплывающего окна.

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

public static class VisualTreeEnumeration
{
    public static IEnumerable<DependencyObject> Descendents(this DependencyObject root)
    {
        int count = VisualTreeHelper.GetChildrenCount(root);
        for (int i = 0; i < count; i++)
        {
            var child = VisualTreeHelper.GetChild(root, i);
            yield return child;
            foreach (var descendent in Descendents(child))
                yield return descendent;
        }
    }
}

Это добавляет метод расширения к DependencyObject, который использует VisualTreeHelper для унификации поиска объектов, добавленных в визуальное дерево. Таким образом, в коде управления пользователя вы можете сделать это: -

var popup this.Descendents()
        .OfType<Popup>()
        .Where(p => p.Child == button)
        .FirstOrDefault();

Это найдет Popup, который является родителем "кнопки".

2 голосов
/ 05 января 2010

Popup контроль иногда очень раздражает. И я не знаю, почему VisualTreeHelper.GetParent(button) возвращает ноль. Но для второго это может помочь.

0 голосов
/ 27 ноября 2012

Убедитесь, что PopUp присоединен к VisualTree. Более подробную информацию об этом можно найти в разделе «Примечания». http://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.popup(v=vs.95).aspx

0 голосов
/ 10 февраля 2010
Решение

Зихотки выглядит многообещающе (я его не тестировал).

Хотя VisualTreeHelper.GetParent(button) возвращает ноль, вы можете использовать button.Parent, что должно дать вам всплывающий объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...