当我第一次了解微软开发桌面应用程序的新框架WPF时,我认为它最大的好处之一就是它的效率。毕竟,我已经知道了我想要使用的GUI控件和元素是什么--我只需要把它们都放在页面上,然后正确地连接我的所有绑定,就完成了。在那之后,我了解了MVVM模式,它承诺在我的WPF应用程序中干净地分离关注点。
我想这会很棒的!我和我的团队在工作中创建了几个不同的管理和数据输入WPF应用程序,因此我开始用健壮但简单的GUI开发工作软件,对吧?
别急,好了,牛仔程序员。我的经验是,写WPF是S-L-O-W。
至少我是这么做的。您看,在白板上有了GUI的图片之后,我用我想要的控件编写了XAML。不出所料,这一部分很快--整个窗口的布局非常快。在那之后,你想让这些元素做的所有小事情都需要一段时间。在某些情况下,我似乎总是希望将此文本设置为粗体;在其他情况下,则显示一个红色的错误框。
然后事情就发生了:这个绑定在这里不能正常工作--我必须编写一个转换器并调整布局以获得正确的值。哦,我把那个额外的NotifyPropertyChanged忘在那儿了。哦,我想在这个状态下和那个状态下使用不同的模板,所以我必须弄清楚在某些情况下我可以使用什么来交换模板。这些数据是异步传入的,所以我需要确保在正确的线程上发生正确的事情,并且该属性也获得NotifyChanged。糟糕,当我最大化我的窗口时,它没有像我想象的那样伸展--肯定是因为它的容器高度没有定义,但我不想定义它,所以我必须让它在它的父级中伸展。哦,现在我真的想在这里创建一个用户控件,所以我最好实现一些依赖属性……
我继续着,花了几个小时和几天的时间在那些感觉很小很小的东西上。我很快就求助于削减可用性特性和外观增强,因为这花费的时间太长了。
谁有任何技巧或原则,我需要尝试,以有效地编写WPF?
发布于 2011-08-25 00:37:01
编写您自己的库,或者找到现有的库。
WPF很棒,但它缺少了一些可以让编码速度更快的东西。我厌倦了重复编写相同的东西,所以我最终创建了自己的库,里面充满了转换器、可视化树帮助器、附加属性、自定义控件等内容,从那时起,我的开发时间大大加快了。
除了我自己的库之外,我还开始使用微软的Prism和Galasoft的MVVM Light Toolkit。它们都包含我一直在使用的有用的对象,而且比我自己编写的代码要好。(最常用的是来自Prism的NotificationObject
,来自MVVM Light Toolkit的RelayCommand
,以及来自任一项目的EventAggregator
或Messenger
,等等)
为了加快编码速度,我做的另一件事是利用Visual Studio的宏。例如,要创建一个具有更改通知的属性,我编写了私有属性,点击生成公共版本的Ctrl+E
,Ctrl+R
,然后运行一个宏,该宏在setter方法中自动设置PropertyChanged
通知。
我几乎从不更改默认宏的设置器方法,而是使用PropertyChanged
事件来处理设置器上应该发生的任何更改。这不仅使跟踪应用程序流变得更容易,而且还极大地减少了我过去浪费在浏览公共属性以更改setter方法上的时间。
发布于 2011-08-25 01:08:17
有几件事为我节省了很多时间:
DockPanel
作为布局的默认面板,除非你有充分的理由不这样做。INotifyPropertyChanged
的ViewModelBase
类,RelayCommand
类等。没有必要花哨,并试图将其作为构建到项目中的单独程序集;只需编写相当好的实现并将其复制/粘贴到新项目中即可。<代码>h19获取Resharper并使用它。使用模板创建依赖项属性、更改通知的属性和commands.
我发现,即使对于非常简单的应用程序,使用WPF也比使用Windows窗体更快地完成了更多的工作。对于不是非常简单的应用程序,绝对没有可比性。
在大多数情况下,WPF应用程序需要进行大量的开发工作,因为很难将UI特性去掉。你不能简单地说,“哦,那是不可能的”,因为它很可能是可能的(不管“它”是什么)。
发布于 2011-08-25 00:36:02
我相信正确的答案根本不适用于WPF,但它可以满足您的需求。
大多数时候,当你想要利用一项新技术时,你的效率和生产力都不是很高,你的解决方案也不是那么令人印象深刻,没有创意,或者看起来不像其他人。
使用WPF本身会给你带来更高的效率。
它更多的是关于项目管理的主题,而不是编程。在完成一些项目后,你的团队和你应该去一些房间讨论:
development.
如果每个人都分享他们的知识,项目经理或团队负责人做好记录每个项目故事的工作,最终每个人都会有一个“诀窍”。
此外,重要的是,您不需要为每个新项目重新发明轮子:如果某个模式工作得很好,那么下次也要用同样的方法,即使这不是最好的方法。如果可能的话,试着增强它。
设计模式,技术,范式,语言,公司,同事和什么都不是是银弹:微软说WPF是Windows客户端开发的进步,它是:一种更现代的方法来提供闪亮的用户界面和编程范式,适合当今所需的方法,缓解了程序员和设计师之间的关系,就像WPF有XAML,它不仅允许分离关注点,而且允许按领域分离专业人员(设计师,UI程序员,业务程序员,...)。
最后,正如我上面所说的,WPF不会是你的银弹:从你自己的成功中学习并阅读很多东西,查看示例应用程序,下载开源解决方案,倾听你的同事,喝杯咖啡,毕竟,在不久的将来的某一天,在一些令人头疼的事情之后,你将利用这些技术(以及许多其他技术)。
编辑
我想补充的是,使用技术诀窍的一个好方法是创建一个Visual Studio指导包,这样您就可以像创建管理器、视图、模型和其他事情一样自动执行许多任务,就像您的团队手动完成的那样。
例如,您可以为类似于WPF CRM的应用程序创建一个指导包,并且可以自动创建模块。当你想要添加一个新模块时,指导包会启动一个过程,这个过程会添加所有必要的类来开始开发这个新模块,并且它可以创建一个已经与导航管理器、控制器或其他任何东西关联的示例表单(这只是一个示例)。
Guidance pack和T4都是自动化日常任务中繁琐或重复的任务的好工具:
https://stackoverflow.com/questions/7178873
复制相似问题