我越了解WPF和XAML,我越发现你可以在XAML或代码(比如C#代码或VB.Net代码)中完成所有GUI初始化和事件处理。
我的问题是那些已经在WPF工作更长时间的人,理想情况下那些已经发布了应用程序的人 - 你在哪里找到了在XAML和代码之间“画线”的最佳位置?你有没有在任何地方使用XAML?只有在与非编码UI设计师接口的地方?
这方面的任何提示对我和刚刚进入WPF编程的其他程序员都非常有帮助,并且会因我们所做的所有选择而陷入瘫痪状态!
答案 0 :(得分:19)
我要看的一件事是模型 - 视图 - 视图模型模式。这是一个非常优雅的模式,自然地将所有东西分成漂亮的桶......包括你的xaml。
例如,它可以帮助您在开发人员和设计人员之间保持清晰的界限,甚至允许进行测试驱动的开发。
其中有很多信息,但我会从John Gossman的博客文章开始:
<强>更新强> 只想将人们指向另一个StackOverflow post,其中有很多关于M-V-VM的良好信息。
答案 1 :(得分:14)
一个提示是不在XAML中声明事件处理程序。相反,命名您的元素并在代码隐藏中附加事件处理程序。这有助于在设计人员和开发人员之间保持清晰的分离。
答案 2 :(得分:10)
正如其他人所建议的那样,请尝试遵循Model-View-ViewModel模式。但是,把东西放在代码隐藏中是可以的!规则是,如果它与“视图”相关,则将其放在Xaml或代码隐藏中(以更方便的方式)。如果与用户如何与系统交互相关的业务逻辑更多,则它属于ViewModel。如果它只是与交互无关的业务逻辑,则属于模型。
每个例子都是:
模型:定义一个名为ModifiedDate的属性,用于存储上次修改的时间。
ViewModel :将ModifiedDate转换为名为ModifiedAge的枚举属性,具体取决于修改时间:昨天,上周,上个月,去年等
查看:将ModifiedAge属性转换为背景颜色,其中最近访问的数据突出显示为亮黄色,而最近访问较少的数据更像是设计师的米色 - 卡其色灰色坚持称为“Meadow Lark Lilly Flowerpot”。
答案 3 :(得分:6)
另一个提示是将XAML分为功能和美学。开发人员通常使用功能性XAML,而设计人员主要关注美学。这使得功能XAML非常容易理解,这很重要,因为开发人员经常需要编辑这样的XAML。美学XAML通常由设计师使用工具编辑,因此它的整洁和冗长不是问题。
前一段时间我做过一篇关于此事的博客文章here。
答案 4 :(得分:4)
不要忘记XAML 是代码这一事实。它是声明性的,但仍然是一种编程语言。事实上,它在转换为IL以供.NET编译器咀嚼之前,会通过转换为C#或Visual Basic。
我将回应Scott Whitlock的评论:MVVM是分离关注点和关注架构细节的好方法。把东西放在代码隐藏中真的非常好,特别是他描述的东西。如果您没有要求将设计人员与开发人员分开,那么请根据您的特定需求调整MVVM模式;不要试图迫使自己变得纯洁或理想主义。
如果您不需要使用ICommand类进行命令的灵活性,那么在后面的View代码中调用ViewModel的方法也是完全可以的。或者,如果您知道正在制作的视图将始终绑定到您正在制作的ViewModel类。或者您可以更进一步,为ViewModel定义一个接口,并仅绑定到该接口的实现。然后你仍然可以随时换掉ViewModel。
这样的东西。
答案 5 :(得分:3)
当您按照 Mode-View-ViewModel 这样的正确模式进行操作时,您将有机会在XAML方面做更多事情,而在后面的代码上做得更少。最大化WPF代码中 RoutedEvents 和命令的使用。
答案 6 :(得分:2)
在构建UserControls时,我尝试尽可能地进行Xamlize。
我在现场发现的一个提示是手工创建ControlTemplate
和DataTemplates
真是一种痛苦......我总是在XAML中写这些......
答案 7 :(得分:1)
我会说尽可能多地使用xaml,使用Binding
,commands
,styles
,templates
等。我必须支持使用XAMLReader保存和加载模板的功能/ XAMLWriter,对于拥有更多xaml的控件更容易。