Stumped - пузырящийся маршрутный переход к верхнему окну в WPF - как захватывать где угодно! - PullRequest
9 голосов
/ 04 марта 2010

Литература ужасна в этом отношении - все, что я хочу сделать, это создать событие из элемента управления, который я определил, но создал на лету (надеюсь, это не вызовет проблем) из класса контроллера брокера. Элемент управления представляет собой всплывающее окно.

public static readonly RoutedEvent weClosed = EventManager.RegisterRoutedEvent("TIMBOO", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(FixedTaskbarNotifier));


    // Provide CLR accessors for the event
    public event RoutedEventHandler TIMBOO
    {
        add { AddHandler(weClosed, value); }
        remove { RemoveHandler(weClosed, value); }
    }

    // This method raises the Tap event
    void RaiseTapEvent()
    {
        RoutedEventArgs newEventArgs = new RoutedEventArgs(weClosed);
        RaiseEvent(newEventArgs);}


    protected override void OnClosed(EventArgs e)
    {
        //TO DO - rearrange current open windows - fire event?
        Log.Instance.Info("Clean up Window");
        RaiseTapEvent(); This is called on close but nothing fires ..
                }

Я надеюсь где-нибудь поймать событие - даже в моем родительском окне или выше в визуальном дереве. Здесь есть ссылка на контроллер, который содержит список элементов управления уведомлениями - раз я знаю, какой из них был закрыт, я могу повторно просмотреть / перекрасить любые другие, все еще активные через контроллер, но как его перехватить? Спасибо!

Ответы [ 2 ]

5 голосов
/ 05 марта 2010

Согласен, документация по пузырям / туннелированию на MSDN совсем не велика.

Я нашел эту статью в журнале MSDN "Понимание перенаправленных событий и команд в WPF" гораздо лучше объясняет всплывающие события.

Найдите раздел «Маршрутизация событий», копия вставлена ​​ниже:

Event Routing

Понимание немного о логических и визуальных деревьях важно, потому что перенаправленные события получают маршрутизируется в основном на основе визуального дерево. Направленные события поддерживают Стратегия маршрутизации пузыря, туннеля или Прямая.

Пузырь является наиболее распространенным и означает, что событие будет пузыриться (распространять) вверх по визуальному дереву от исходный элемент, пока он не будет был обработан или доходит до корня элемент. Это позволяет вам обрабатывать событие на объекте далее вверх иерархия элементов из источника элемент. Например, вы можете прикрепить обработчик Button.Click на включающий элемент Grid вместо прямо на самой кнопке. Пузырь события просто имеют имена, которые указывают их действие (например, MouseDown).

Туннельные события уходят в другие направление, начиная с корня элемент и прохождение вниз по элемент дерева, пока они не будут обработаны или достичь исходного элемента для событие. Это позволяет вышестоящим элементам перехватить событие и обработать его до того, как событие достигнет источника элемент. Туннельные события имеют свои имена с префиксом Preview by соглашение (например, PreviewMouseDown).

Прямые события ведут себя как обычно события в .NET Framework. Единственный потенциальный обработчик события делегат, который подключен к событие.

Обычно, если событие Tunnel определенный для конкретного события, там это соответствующее событие Bubble. В в этом случае происходит событие Tunnel во-первых, начиная с корня и пробирается к источнику элемент ищет обработчик. Однажды это был обработан или достиг Исходный элемент, событие Bubble выстрелил, пробираясь от исходный элемент и ищет обработчик. Событие Bubble или Tunnel делает не остановить свою маршрутизацию только потому, что обработчик события называется. Если ты хочешь чтобы прекратить пузыриться или туннелирование процесс, вы помечаете событие как обработанное в вашем обработчике событий, используя событие аргументы вы передали:

private void OnChildElementMouseDown(object sender, MouseButtonEventArgs e) { e.Handled = true; }

Как только ваш обработчик помечает событие как обрабатывается, он не будет поднят ни к одному больше обработчиков. Ну это только частично верно. На самом деле событие маршрутизация продолжается за кулисами, и вы можете явно подключить событие обработчики в коде с переопределением метод UIElement.AddHandler, который имеет дополнительный флаг для эффективного сказать: «Позвони мне, даже если событие помечены как обработанные. "Вы указываете этот флаг с вызовом, как следующим образом:

m_SomeChildElement.AddHandler(UIElement.MouseDownEvent, (RoutedEventHandler)OnMouseDownCallMeAlways,true);

Первый параметр AddHandler RoutedEvent, который вы хотите обработать. Второй является делегатом метод обработки событий (который потребуется иметь правильную подпись для делегат мероприятия). Третий параметр указывает, хотите ли вы быть даже если другой обработчик пометил событие как обработанное. элемент, на котором вы вызываете AddHandler это тот, который будет следить за событие для прохождения во время маршрутизации.

Надеюсь, это поможет.

3 голосов
/ 04 марта 2010

У вашего родителя или там, где вы хотите его обработать, вы просто должны иметь возможность обрабатывать событие, указав, в каком классе оно объявлено, и в имени события. В вашем случае в объявлении окна выполните:

<Window ... FixedTaskbarNotifier.TIMBOO="<EventHandlerName>">

Это поймает все всплывающие события, которые не были отменены (и вы даже можете получить их, если хотите, хотя я считаю, что это не считается хорошей практикой).

В качестве простого примера создайте окно и поместите на него кнопку. В окне добавьте обработчик для операции щелчка (который определен в ButtonBase)

<Window ... ButtonBase.Click="Window_Click">

Это будет срабатывать при каждом нажатии любой дочерней кнопки, даже внутри дочерних элементов управления и т. Д., Если событие не было намеренно отменено.

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