Вообще говоря, похоже, что вам нужна какая-то служба событий шаблонов издателя / подписчика в вашем приложении. Это будет объект Singleton, на который может подписаться ваше внешнее окно. Общий вызов этой службы может выглядеть примерно так:
EventService.Instance.AddListener( "TheEventICareAbout"
, delegate( possiblySomeParameters ) {
//Do Interesting Stuff Here. This code can access members of your
//window class or call methods on it to react to the event.
} ) ;
Тогда ваша дочерняя страница может вызвать какое-то событие в сервисе:
EventService.Instance.RaiseEvent("TheEventICareAbout"
, new EventParameters( possiblySomeParameters ) ) ;
Внутренне, сервис, вероятно, просто словарь имен событий и фреймворка event
s. Ваш AddListener
проверит, существует ли уже имя события, и, если это так, добавит нового делегата в event
. Если нет, он создаст новую запись в словаре и сохранит новый делегат, как в event
.
Большинство фреймворков приложений в какой-то момент используют этот шаблон, поэтому я уверен, что есть множество вариантов, если вы не хотите писать свои собственные. Посмотрите на агрегатор событий Prism. Это краткое введение , но основной формат останется неизменным, независимо от того, пишете ли вы его самостоятельно или захватываете уже существующее решение.
Основными преимуществами этого подхода являются слабая связь и расширяемость. Это также хорошо подходит для архитектуры MVVM, где ваша ViewModel может вызвать событие, на которое реагируют другие ViewModel. Это позволяет вам вывести свою бизнес-логику из своего View и в другое место, где вы можете проверить ее более полно.
Хотя я бы не рекомендовал этого, другой вариант для «быстрого и грязного» решения - добавить событие на вашу страницу и добавить в него обработчик Window. Страница может затем вызвать это пользовательское событие. Здесь вы должны быть осторожны с сборщиком мусора (ваша страница может не получить GCed, если вы не удалите обработчик должным образом) и убедитесь, что у вас не будет много страниц, каждая из которых вызывает немного другое событие .