开发WPF应用程序的最佳方法

本文关键字:最佳 方法 应用程序 WPF 开发 | 更新日期: 2023-09-27 18:01:30

我想创建一个WPF应用程序,并希望得到一些关于最合适方法的建议。

我想创建一个RSS阅读器,它在添加新的RSS条目时自动刷新。问题是,我不想使用传统的控件(listbox/listview)来显示数据。我希望feed项目随机出现在屏幕上的面板中。这些面板由几个文本块组成。每个面板显示一个提要项。

它看起来像这样:概念

这引出了几个问题:

1:完全从代码生成面板,还是使用自定义控件?

我将像上面描述的面板那样建模一个类。该类手动将所有控件添加到窗体中,并将面板放置在窗体上的随机位置。当添加新的RSS条目时,该类的实例被实例化,并将RSS信息作为参数传递。

另一方面,最好为此创建一个UserControl。通过代码创建这个UserControl并在构造函数中传递参数是否容易?

2:当新的RSS条目在线添加时,我的数据/面板是否会自动更新?

现在我将刷新每(x)秒和检查面板集合,如果有一个新的创建。如果是,创建一个新的面板,并将其随机放置在表单上。

有更好的方法吗?我可以使用本地ObservableCollection与数据绑定,自动更新控件(列表框等)时,集合的变化,这也可以做一个在线源,如RSS提要?

最理想的方式是当一个新的RSS条目被添加时,我的应用程序得到通知,下载最后一个条目并创建一个新的Panel(通过代码或通过UserControl)

如果这很难完成,我将使用传统的刷新方法。

3:我必须使用DependencyObject/DependencyProperty吗?

我知道DependencyObject &DependencyPropertyUserControls提供了一些强大的功能,但我真的不知道如何使用它们。它们对于这种应用是必需的吗?

4:我必须使用WCF (Windows通信基础)吗?


我对高级数据绑定、DependencyObjects和UserControls等"高级"WPF的东西并没有真正的经验,但我喜欢学习!

开发WPF应用程序的最佳方法

我建议首先考虑使用MVVM设计模式,并使用MVVM框架。其次,你可以使用ItemsControl并使用Canvas作为它的ItemsPanel类型来实现这个效果,然后你可以使用一个自定义ItemTemplate,它使用UserControl来呈现每个数据对象。

用户控件将有一个依赖属性,它是数据项,你将在项模板声明中绑定它。

你可以有一个模型来建模每个RSS条目(RSSEntry),也许还有一个RSSEntryViewModel来添加画布上的x和y坐标。

你的屏幕视图模型将有一个RSSViewModel的ObservableCollection,你可以添加/删除等,UI将自动更新。

如果你不想,你不需要一个服务层,但是只要你的视图模型通过抽象来检索条目,它应该很容易在将来重构。

  1. 完全从代码生成面板,还是使用自定义控件?我通常在XAML中尽可能多地声明,分离逻辑和表示通常有助于应用程序的可伸缩性和代码质量——当然也有限制。UserControl通常不应该在它们的构造函数中有参数(并不是说它们不能有参数,但是你必须有一个无参数的构造函数,这样类才能从XAML实例化)。

  2. 当新的RSS条目在线添加时,我的数据/面板是否会自动更新?必须有一些东西发送更新通知到WPF层,所以它可以更新显示。如果是RSS应用程序,我猜你将不得不手动定期扫描RSS频道以获取更新(RSS是一种拉式技术),并且在更新的情况下将项目添加到ObservableCollection中,它将为你发送适当的更新通知。

  3. 我必须使用DependencyObject/DependencyProperty吗?不,您可以使用INotifyPropertyChanged。DependencyProperties通常用于作为绑定目标(声明绑定的属性)的属性,或者用于利用任何其他DP特性(值继承或动画)的属性。对于绑定到的属性(在绑定表达式中命名),INotifyPropertyChanged就足够了。注意,您可以使用NotifyPropertyWeaver来自动生成INotifyPropertyChanged的通知——您只需创建onpropertychanged方法,然后每当对象的任何属性发生变化时,weaver就会调用它!它甚至可以与Visual Studio完美集成。

  4. 我必须使用WCF (Windows通信基础)吗?对于WCF,你必须有一些东西来进行通信——毕竟它是一个通信框架。你呢?

  1. 你应该使用WPF列表视图(或类似的;不确定究竟是哪个控件),并将其主题化以匹配您想要的"面板"想法。这是WPF的一大优势。然后,您可以获得内置控件的所有好处,并具有您想要的任何外观。

  2. 绑定ObservableCollection;如何更新observable集合是你自己的事。我不认为RSS规范中有"推送通知"的部分,所以轮询通常是这样做的。但最终这并不重要;这部分代码是完全独立于WPF的,所以只要它更新了ObservableCollection,你就可以了。

  3. DependencyObject/DependencyPropertyINotifyPropertyChanged对于任何具有数据绑定的WPF应用程序通常是必需的。学习它们是值得的,然后也许可以学习一个为你抽象它们的框架。

  4. 没有;WCF与WPF无关。您可以使用任何技术与您喜欢的服务器通信

1:完全从代码生成面板,还是使用自定义控件?

创建两个视图模型类。一个类将为所有项目的视图建模,另一个类表示单个项目的内容。前者将包含后者的一个可观察集合。

构建一个用户控件来显示每个控件。

容器视图将是一个ItemsControl,它的ItemsSource绑定到它的项目视图模型集合,它的ItemsPanel是一个Canvas,它的ItemContainerStyleCanvas.TopCanvas.Left属性绑定到项目视图模型中的TopLeft属性。当一个新项目被添加到视图模型的集合中时,binding会自动为它创建一个新的面板。

项目视图模型将自己生成TopLeft的随机值。(也可以让它们在构造容器时从容器请求值。)

(如果术语"视图模型"对你来说没有任何意义,你需要研究模型/视图/视图模型模式,即MVVM。)

2:当新的RSS条目在线添加时,我的数据/面板是否会自动更新?

首先,您需要研究RSS聚合器是如何工作的,因为您正在编写一个。这将向您解释从RSS提要获取更新的机制。这个问题与你得到更新后如何呈现更新的问题是完全不同的。

您的RSS聚合层将检查提要,查找新项目,当它找到新项目时,引发事件。UI层将处理聚合层引发的事件,并为接收到的每个新项目创建新的视图模型对象。

事件的使用完全将两个组件相互解耦。例如,您可以通过构建一个生成测试消息的模拟聚合器来测试您的UI,并让您的UI侦听它而不是真正的聚合器。类似地,您可以测试聚合器而无需构建—您可以构建一个侦听器,该侦听器注册其事件并将项目转储到控制台。

3:我必须使用DependencyObject/DependencyProperty吗?

你可能不需要实现你自己的,不。

4:我必须使用WCF (Windows通信基础)吗?

为什么不呢?