我想创建一个WPF应用程序,并希望就最合适的方法提供一些建议。
我想创建一个RSS阅读器,在添加新的RSS条目时自动刷新。问题是我不想使用传统控件(listbox / listview)来显示数据。我希望Feed项在屏幕上随机出现在面板中。这些面板由几个文本块组成。每个面板显示一个Feed项。
它看起来像这样: Concept
这提出了几个问题:
1:完全从代码生成面板,还是使用自定义控件?
如上所述,我会像面板一样建模。此类手动将所有控件添加到窗体,并将面板放在窗体上的随机位置。添加新的RSS条目后,将实例化此类的实例,并将rss信息作为参数传递。
另一方面,为此创建UserControl
可能更好。是否可以通过代码轻松创建此UserControl并将其传递给构造函数中的参数?
2:在线添加新的RSS条目后,我的数据/面板会自动更新吗?
现在我会每隔(x)秒刷新一次,并检查一组面板是否必须创建一个新面板。如果是这样,请创建一个新面板并将其随机放在表单上。
有更好的方法吗?我可以使用带有数据绑定的本地ObservableCollection
,当集合发生变化时自动更新控件(列表框等),这也可以通过RSS源等在线源完成吗?
最理想的方式是在添加新RSS条目时通知我的应用程序,下载最后一个条目并创建新的Panel(通过代码或通过UserControl)
如果这很难完成,我将使用传统的刷新方法。
3:我是否必须使用DependencyObject / DependencyProperty?
我知道DependencyObject
& DependencyProperty
为UserControls
公开了一些强大的功能,但我真的不知道如何使用它们。这种应用是否必要?
4:我是否必须使用WCF(Windows Communication Foundation)?
我对高级数据绑定,DependencyObjects和UserControls等“高级”WPF的使用并不熟悉,但我喜欢学习!
答案 0 :(得分:2)
我建议首先考虑使用MVVM设计模式,并使用MVVM框架。其次,您可以使用ItemsControl实现此效果并使用Canvas作为ItemsPanel类型,然后您可以使用自定义ItemTemplate,它使用UserControl呈现每个数据对象。
用户控件将具有依赖项属性,该属性是数据项,您可以在项模板声明中绑定它。
你可以有一个模型来模拟每个RSS条目(RSSEntry),也许还有一个RSSEntryViewModel,它在画布上添加x和y坐标。
您的屏幕视图模型将具有RSSViewModel的ObservableCollection,您可以添加/删除等,UI将自动更新。
如果您不想要,则不需要服务层,但只要您的视图模型通过抽象检索条目,将来很容易重构。
答案 1 :(得分:2)
完全从代码中生成面板,还是使用自定义控件?我通常尝试尽可能多地在XAML中做声明,分离逻辑和表示通常有助于应用程序的可伸缩性和代码质量 - 但当然有限制。 UserControl
一般不应该在它们的构造函数中有参数(不是它们不能拥有它们,而是你必须有一个无参数的构造函数,所以可以从XAML实例化该类)。
在线添加新的RSS条目后,我的数据/面板是否可以自动更新?必须要有更新通知发送到WPF层,以便更新显示。如果是RSS应用程序,我猜你必须手动定期扫描RSS频道以获取更新(RSS是pull technology),如果有更新,请将项目添加到ObservableCollection
中,这将发送适合您的更新通知。
我是否必须使用DependencyObject / DependencyProperty?不,您可以使用INotifyPropertyChanged。 DependencyProperties通常用于属性中,这些属性将用作绑定目标(声明绑定的属性)或属性中将利用任何其他DP功能 - 值继承或动画。 INotifyPropertyChanged
足以用于绑定的属性(在绑定表达式中命名)。请注意,您可以使用NotifyPropertyWeaver自动生成INotifyPropertyChanged
的通知 - 您只需创建OnPropetyChanged方法,然后只要对象的任何属性发生更改,编织者就会调用它!它甚至可以与Visual Studio完美集成。
我是否必须使用WCF(Windows Communication Foundation)?对于WCF,您必须要与之通信 - 毕竟它是一个通信框架。你呢?
答案 2 :(得分:1)
您应该使用WPF列表视图(或类似的;不确定哪个控件完全确定),主题以匹配您想要的“面板”想法。这是WPF的强大优势之一。然后,您可以获得内置控件的所有优点,并且具有您想要的任何外观。
绑定到ObservableCollection
;如何更新可观察的集合是您的业务。我不认为RSS有一个“推送通知”部分的规格,所以轮询是这些事情通常是如何完成的。但最终它并不重要;你的代码中的那部分与WPF完全分开,所以只要它更新了ObservableCollection
,你就会很好。
对于具有数据绑定的任何类型的WPF应用程序,通常都需要DependencyObject
/ DependencyProperty
或INotifyPropertyChanged
。值得学习它们,然后学习一个框架,为你抽象出来。
没有; WCF与WPF无关。您可以使用任何技术与您喜欢的服务器通信。
答案 3 :(得分:0)
1:完全从代码生成面板,还是使用自定义控件?
创建两个视图模型类。一个类将对所有项目的视图进行建模,一个类别表示单个项目的内容。前者将包含后者的可观察集合。
构建用户控件以显示每个控件。
容器视图将是ItemsControl
,其ItemsSource
绑定到其项目视图模型集合,其ItemsPanel
为Canvas
,其ItemContainerStyle
将Canvas.Top
和Canvas.Left
属性绑定到项目视图模型中的Top
和Left
属性。将新项目添加到视图模型的集合中时,绑定将自动为其创建新面板。
项目视图模型将自己生成Top
和Left
的随机值。 (您也可以让它们在构造时从容器中请求值。)
(如果术语“视图模型”对您没有任何意义,则需要研究模型/视图/视图模型模式,即MVVM。)
2:在线添加新的RSS条目后,我的数据/面板会自动更新吗?
首先,您需要研究RSS聚合器的工作原理,因为您正在编写一个。这将向您解释从RSS源获取更新的机制。这个问题完全不同于一旦获得更新就会出现更新的问题。
您的RSS聚合图层将检查供稿,查找新商品,以及何时找到新商品,举起活动。您的UI层将处理聚合层引发的事件,并为接收的每个新项创建新的视图模型对象。
事件的这种使用完全将两个组件相互分离。例如,您可以通过构建一个模拟聚合器来测试您的UI,该聚合器生成测试消息并让您的UI听取它而不是真正的聚合器。类似地,您可以在不构建的情况下测试聚合器 - 您可以构建一个监听器来注册其事件并将项目转储到控制台。
3:我是否必须使用DependencyObject / DependencyProperty?
你可能不必实现自己的,没有。
4:我是否必须使用WCF(Windows Communication Foundation)?
你为什么不呢?