【发布时间】:2011-06-18 16:47:08
【问题描述】:
我希望得到一些指导。我有一个 wpf 应用程序,其中包含一个窗口 (Window1) 和一个页面 (Page1)。该页面使用框架在窗口内。
我在页面中有一个按钮,我希望能够按下该按钮并将字符串值传递回主窗口并在标签中显示它。
任何人都可以提供一个基本示例,因为我不知道!
【问题讨论】:
我希望得到一些指导。我有一个 wpf 应用程序,其中包含一个窗口 (Window1) 和一个页面 (Page1)。该页面使用框架在窗口内。
我在页面中有一个按钮,我希望能够按下该按钮并将字符串值传递回主窗口并在标签中显示它。
任何人都可以提供一个基本示例,因为我不知道!
【问题讨论】:
一般来说,听起来您的应用程序中需要某种发布者/订阅者模式事件服务。这将是您的外部窗口可以订阅的 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 ) ) ;
在内部,服务可能只是事件名称和框架events 的字典。您的AddListener 将检查事件名称是否已经存在,如果存在,则将新委托添加到event。如果没有,它将在字典中创建一个新条目并将新委托存储在 event 中。
大多数应用程序框架在某些时候都会使用这种模式,所以如果您不想编写自己的模式,我相信有很多选择。看看 Prism 事件聚合器。 This is a short introduction,但无论您是自己编写还是使用预先存在的解决方案,基本格式都将保持不变。
这种方法的基本优点是松散耦合和可扩展性。它也非常适合 MVVM 架构,您的 ViewModel 可以引发事件以供其他 ViewModel 做出反应。这使您可以将业务逻辑从您的视图中移出,并放到可以更完整地对其进行测试的地方。
虽然我不推荐它,但“快速而肮脏”的解决方案的另一个选择是向您的页面添加一个事件,并让窗口向它添加一个处理程序。然后页面可以引发此自定义事件。您在这里要注意的事情是垃圾收集(如果您没有正确删除处理程序,您的页面可能不会被 GC)并确保您不会遇到很多页面,每个页面都会引发稍微不同的事件.
【讨论】: