WPF中实现MDI应用程序的最佳方法是什么?

9

我正在为一家商店开发WPF应用程序。

因此,我有一个MainWindow窗口,其余部分将作为子窗口。

那么,什么是最好的用作子窗口的选项?

  1. 窗口(Window)
  2. 用户控件(UserControl)

如果使用窗口,则它将是普通的,它将位于MainWindow窗口的顶部。如果使用用户控件,则它将位于MainWindow窗口的画布上。

所以,有人能建议我在这两个选项中选择哪一个吗?

6个回答

11

我建议您使用UserControls来创建子窗口,这样你可以在主窗口上设置所有“父级”控件并且孩子窗口不会覆盖它们。

另一些建议是,您可以考虑使用Caliburn Micro框架。这是一个处理WPF窗口和用户控件的优秀框架。

要将子UserControl添加到父窗口中,我通常只需像这样将ContentControl添加到我的主窗体中:

<ContentControl x:Name="ViewWindow" Margin="10" />

只需将您的子控件分配给该控件,您就没问题了。


我该如何将子窗口(UserControl)添加到主窗口中,使用Canvas好吗?由于我需要同时打开多个子窗口。 - Kishore Kumar
我通常只是将ContentControl添加到主窗口。我已经编辑了我的帖子,以便为您提供更多细节。 - IAmTimCorey
ContentControl是否支持多个子控件? - Kishore Kumar

4

这实际上是使用WPF的MDI应用程序的最佳方法之一,因为它改进了旧MDI应用程序的缺点,并且MVVM也可以与此相容。 - Tae-Sung Shin

2

像生活中的许多事情和编码一样,这取决于情况 :)

  • 窗口

    • 当新窗口具有自己的状态和行为时
    • 当主窗口与弹出窗口之间几乎没有交互/消息时
  • 用户控件

    • 当底层主窗口的状态对弹出窗口的操作至关重要时
    • 当需要在两个窗口之间传递状态更改时

这些是一些设计决策...


2

关于 wpfmdi 项目,“看起来该项目又被放弃了”,根据去年二月的一篇帖子。 - user316117

1
考虑查看MDIContainer。这是一个类似于WPF中的MDI的项目,但它给予您更多自由,因为它不会强制您实现MDIChild窗口、接口或任何其他内容。

1

当您决定使用父子窗口交互时,子窗口对于桌面应用程序将非常有用,尽管我个人建议您在主窗口中使用框架并将其用于托管多个页面。

要了解有关WPF和Silverlight中导航的更多信息,请访问this link

使用此方法将帮助您实现以下优点:

  1. 由于未附加事件处理程序而减少内存泄漏的机会。
  2. 无需为子窗口指定样式即可实现一致的设计,因为您可以将页面背景设置为透明。
  3. 当其他程序与您正在构建的软件同时使用时,用户不会难以找到哪个窗口具有焦点。

我还认为,在构建此软件时,您还可以考虑很多东西,但归根结底,您仍然是应该决定这个问题的人。

这只是我的建议,希望这有所帮助 :)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接