窗体/ WPF 太大了,我该如何拆分它?

6
我即将创建一个WPF应用程序。到目前为止,在大学里我们处理GUI的唯一方法就是有一个带有一个代码后台文件来处理其按钮点击等的主窗口。
我的问题是,随着应用程序的增长,GUI也增长了,代码后台文件的大小可能会变得非常混乱!我已经为我的系统确定了约15个主要用例(例如:输入详细信息,查看详细信息等)。 我正在创建一个主窗口(大小:480x320),它由15个单独的屏幕组成(每个用例一个屏幕)。这可以通过将TabControl居中并拉伸以获得15个TabItem来实现。 或更可能是一堆分层容器,一个在另一个上面(每次只有一个可见)。
重点是,对于15个单独的屏幕,我的代码后台文件将变得非常庞大(更不用说xaml文件!):在状态之间跳转 - 使14个折叠/隐藏和使一个可见,处理15个不同屏幕的控件。
是否有一种方法可以拥有15个单独的窗体,每个窗体都有自己的代码后台文件,而不是在一个窗体上拥有15个TabItem,然后有一个主引擎根据需要创建和删除它们? 当然,它应该看起来像一个窗体,而不是15个弹出窗口。
我该如何处理这个问题?您将如何处理数千行长的xaml和代码后台文件的问题?
6个回答

8
你的直觉很好:你不想把所有东西都放在一个窗口中。最好将这15个“屏幕”中的每一个放在自己的XAML文件中,作为用户控件或页面。
如果Web浏览器样式的导航对你的应用有意义,那么请查看Page类。如果将应用程序的StartupUri设置为指向页面(而不是窗口),则会自动获得带有后退和前进按钮的窗口,并且可以使用Hyperlink(将NavigateUri属性设置为指向另一个页面)或NavigationService的方法导航到新页面。
如果您不想要“后退”和“前进”按钮,则将每个“屏幕”放在自己的UserControl中,并在主窗口中添加一些最小逻辑来显示和隐藏它们。或者,如果您正在使用MVVM,则可以设置一些魔法,只需更改窗口的DataContext(或更好的是应用程序级别的ViewModel上的属性),它会自动加载并显示正确的UserControl(请查看DataTemplate,或观看下面的视频)。
我强烈建议您尽可能使用MVVM编写尽可能少的代码后台(理想情况下不需要任何代码后台--虽然并非总是可行,但尝试一下会让您受益匪浅)。这使得您的XAML更容易重构。如果您后来发现其中一个网格上有太多东西,您可以将其剪切并粘贴到新的UserControl中,而无需花费大量时间解开所有代码后台的纠缠。
由于听起来您不熟悉MVVM模式,因此这个视频可能会让您感到困惑,但我还是要推荐MIX2010演讲“Build Your Own MVVM Framework”。它将为您展示MVVM可以做什么,并提供了一些关于如何管理不同UserControls之间导航的实用思路。(它还提供了一个介绍MVVM的链接。)

6
如果您即将开始使用WPF,您应该一定要看看MVVM设计模式和命令。您还应该考虑使用依赖注入,通过IOC容器,这很容易设置,这是一个很好的教程。在您的示例中,可以创建一个单个视图(用户控件),显示在相关选项卡页上,该视图将具有自己相关的视图模型类,提供数据并通过命令处理任何交互。每个视图模型都将通过IOC容器绑定到其视图,从而使更改用户界面的行为更加容易。

1

你应该将每个屏幕创建为UserControl,并在MainWindow xaml中引用它。

然而,你的应用程序似乎存在一个巨大的设计缺陷,即将逻辑放在UI中。Code-behind文件不是用来驱动你的应用程序或逻辑的,它是用来驱动你的UI的!你可能需要研究一下MVC模式和依赖注入来解决这个问题。

Wpf Application Framework可以作为一个起点。


有些处理程序将负责所有逻辑,或者将在DLL引用中。我只是认为,按照我在分析中提出的用例拆分GUI也是很好/一致的做法。 - Mikey

0

-1
关于代码后台文件,您可以使用#region标签来允许您折叠和展开不同的屏幕...虽然,如果可能的话,逻辑上的拆分是更好的方法。

1
我之前遇到过这个问题,它总让我感觉像是把灰尘藏在地毯下。 - Dan Bryant
我不同意,它可以帮助你逻辑地整理你的代码 - 将事件处理程序、属性等分组。 - Tim Joseph
当类变得足够大时,区域是很有帮助的,但如果它足够大以至于区域是必不可少的,那么这可能意味着该类需要重构。我遇到的情况是,你打开一个文件,看起来它适合两个屏幕。然后你展开了一些区域;好吧,现在可能有十几个区域。哦,但等等,这些区域里面还有区域;事实上,那些“两个”屏幕有成千上万行代码。所有这些代码都在一个类中创建了许多紧密耦合的机会,现在很难测试任何一个独立的部分。 - Dan Bryant

-2
你可以将你的类声明为partial,并将其拆分成不同的文件。

partial 在 XAML 中并不适用,而在 WinForms 中也是一个不好的建议,因为你必须小心所有成员(例如字段名称)不要互相干扰(缺乏封装性)。 - Sinatr

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