代码和XAMLin WPF之间的界限在哪里?

代码和XAMLin WPF之间的界限在哪里?,wpf,xaml,mvvm,Wpf,Xaml,Mvvm,我对WPF和XAML了解得越多,我就越意识到几乎所有的GUI初始化和事件处理都可以用XAML或代码(比如C#代码或VB.Net代码)来完成 我的问题是,对于那些已经在WPF上工作了很长时间的人,理想情况下是那些已经随WPF提供了应用程序的人——您认为在XAML和代码之间“划清界限”的最佳位置在哪里?您是否尽可能使用XAML?仅适用于与非编码UI设计师的接口 这方面的任何提示都将对我自己和其他刚刚进入WPF编程并被我们所能做出的所有选择所麻痹的程序员非常有帮助 一个技巧是不要在XAML中声明事件处

我对WPF和XAML了解得越多,我就越意识到几乎所有的GUI初始化和事件处理都可以用XAML或代码(比如C#代码或VB.Net代码)来完成

我的问题是,对于那些已经在WPF上工作了很长时间的人,理想情况下是那些已经随WPF提供了应用程序的人——您认为在XAML和代码之间“划清界限”的最佳位置在哪里?您是否尽可能使用XAML?仅适用于与非编码UI设计师的接口


这方面的任何提示都将对我自己和其他刚刚进入WPF编程并被我们所能做出的所有选择所麻痹的程序员非常有帮助

一个技巧是不要在XAML中声明事件处理程序。相反,在代码隐藏中命名元素并附加事件处理程序。这有助于保持设计师和开发人员之间的清晰分离。

另一个技巧是将XAML分为功能性和美观性。开发人员通常在功能性XAML中工作,而设计师则主要关注美学。这使得功能性XAML非常容易理解,这一点很重要,因为开发人员经常需要编辑这样的XAML。美学XAML通常由设计师使用工具进行编辑,因此它的整洁和冗长不成问题


不久前我写了一篇关于这个的博文。

在构建用户控件时,我尽量使用Xamlize


我在该领域发现的一个技巧是,手工创建
ControlTemplate
DataTemplates
确实是***的一大难题。。。我总是用XAML写这些…

我要看的一件事是模型-视图-模型模式。这是一个非常优雅的模式,它自然地将所有东西分割成漂亮的桶。。。包括你的xaml

例如,它帮助您在开发人员和设计人员之间保持清晰的边界,甚至允许测试驱动的开发

上面有很多信息,但我会从约翰·戈斯曼的博客文章开始:

更新:
只是想让人们看到另一个StackOverflow,里面有很多关于M-V-VM的好信息。

当您遵循适当的模式,如模式视图模型时,您将有机会在XAML方面做得更多,而在代码背后做得更少。最大限度地利用WPF代码中的路由事件命令。

正如其他人所建议的,尝试遵循模型视图模型模式。然而,把东西放在代码后面是可以的!规则是,如果它与“视图”相关,则将其放在Xaml或codebehind中(以您更方便的为准)。如果更多的业务逻辑与用户如何与系统交互有关,那么它属于ViewModel。如果只是与交互无关的业务逻辑,那么它就属于模型

每种方法的例子如下:

  • 模型:定义一个名为ModifiedDate的属性,该属性存储上次修改的时间

  • ViewModel:根据修改时间,将ModifiedDate转换为名为ModifiedAge的枚举属性:昨天、上周、上月、去年等

  • 视图:将ModifiedAge属性转换为背景色,其中最近访问的数据高亮显示为亮黄色,而最近访问的数据更多为米色卡其灰,设计师坚持称之为“草地云雀礼来花盆”


我想说的是尽可能多地使用xaml,使用
绑定
命令
样式
模板
等等。我必须支持使用XAMLReader/XAMLWriter保存和加载模板的功能,并且对于拥有更多xaml的控件来说更容易。

不要忽视xaml是代码这一事实。它是声明式的,但它仍然是一种编程语言。事实上,在转换成IL供.NET编译器仔细研究之前,它需要先转换成C#或Visual Basic

我将回应Scott Whitlock的评论:MVVM是分离关注点和关注体系结构细节的好方法。把代码中的东西放在后面是非常非常好的,尤其是他描述的东西。如果您不需要将设计人员与开发人员分开,那么请根据您的具体需要调整MVVM模式;不要强迫自己对此保持纯洁或理想主义

如果您不需要灵活地使用ICommand类进行命令,那么将对ViewModel方法的调用直接放在视图代码中也是完全可以的。或者,如果您知道正在创建的视图将始终绑定到正在创建的ViewModel类。或者,您可以更进一步,为ViewModel定义一个接口,并仅绑定到该接口的实现。然后,您仍然可以随时交换ViewModel


诸如此类

我想补充一下,我认为ValueEngvter也是视图的一部分。而且,我也喜欢这个建议,不要太“僵化”地避免代码隐藏。。。避免代码隐藏不是目标。。。把东西放进正确的桶里是非常重要的!很好的回答,根据我的经验,这是自然发生的。也就是说,您最终将样式、模板和资源放在外部资源字典中,剩下的是功能性xaml。。。简洁易懂。回答得好+1.