XAML或C#代码隐藏

我不喜欢使用XAML。 我更喜欢用C#编写所有代码,但是我认为我做错了。

在哪种情况下最好使用XAML,什么时候使用C#? 你有什么经验?

在C#中创build整个窗口可能是一团糟的代码。 关于WPF的最好的事情是XAML允许你将你的devise与逻辑分开,使得代码更容易阅读。

当我需要创builddynamic控件时,我将使用C#,但是我倾向于在XAML中保留我的常规devise,静态故事板,样式,数据types等。

在WPF中的MVVM上看看这个video 。 如果你想围绕如何组织一个WPF应用程序相对于XAML,代码隐藏和其他抽象,这是一个很好的开始。

你当然可以用XAML来做太多的事情。 那些希望在XAML中定义完整用户界面(包括逻辑,事件处理关系等)的人可能会忽略这一点。

XAML的目标是提供一个通用的格式来确定事物的外观 。 它应该只是描述如何摆放,如何对它们进行可视化的颜色和样式。

尝试使用它作为C#的其他方面的替代品是没有多大意义的,因为C#在编程function方面具有永久性的先机 – 重用(定义types和函数),指variables,过程编程和甚至是声明式或function式样式。

就我个人而言,我真的很喜欢用Linqexpression式来投射UI!

最终的荒谬是由一个样本,我看到他们使用工作stream操作作为一个button的孩子提供Click处理程序,所以整个程序是在XAML。 这听起来很“酷”,但问题在于它比相当的C#或VB.NET程序显得更加丑陋和不可读,所以准备在C#中使用的所有东西都必须被更加冗长的片状等价物所取代。 没有什么实际上通过这个翻译成一个丑陋的语法获得 – 这是同样的程序只有更可怕。 XML是一般编程语言语法的一个不好的基础。 从大于号符号必须被写为>的事实开始>

在一个平行的世界里,微软在完成XAML之前发布了C#3.0。 XAML团队采用了C#3.0对象/列表初始化程序语法而不是XML作为它们的语法。 而这整个辩论从来没有发生过。

我的经验是,在C#中有些事情要快得多,而大多数人在XAML中做得更快。 当需要5行C#代码来完成一行XAML代码可以完成的工作时,我很容易select哪一个更好。

基本上,XAML是为了expression视觉devise,C#是为了expression逻辑。

任何可视化devise都应该在XAML中完成,任何逻辑都应该在C#中实现。

– 这使得devise师可以使用视觉devise来玩游戏,而无需担心逻辑的变化,甚至在运行时使用loose-XAMLreplace整个视觉devise。

– 这也意味着你可以更换逻辑或视觉devise,而不会“打破”。

– 两者之间的连接应该使用数据绑定和命令绑定来完成。

我使用的做法是:

1.在单独的C#代码中定义模型(业务数据对象模型)。

2.在XAML中定义视图的常量部分(graphics用户界面的常量部分,例如窗口,菜单…)(最好使用Blend而不是VS)。
*不要在这里定义样式(颜色,字体,…)。
*不要在code-behind-the-XAML中编写button的事件处理程序(大多数情况下),而是使用命令绑定。

3.使用位于单独文件中的XAML“ResourceDictionary”来定义如何在视图内呈现模型(用于查看/编辑数据对象的GUI)。

– 使用混合写,然后添加绑定到XAML使用VS(Jetbrains的Resharper插件VS将帮助绑定expression式)。

– 如果在devise时不知道对象types,可以使用“loose-XAML”并将XAML放置在一个文件夹中,该文件夹可以添加/编辑文件而不需要重新编译。

4.在C#中,在模型和视图(控制器/视图模型)之间创build一个连接:
*根据需要创build视图(对于dynamic对象)
*数据 – 将视图绑定到模型(将视图的DataSource设置为模型中的相关对象)
*实现这些命令
*命令将视图绑定到其内部的命令实现

5.在Application.xaml中删除StartupUri =“MainWindow.xaml”,并添加Startup =“ApplicaitonStartUp”。
在ApplicationStartUp()事件处理程序中:
*加载任何松散的XAML
*创build控制器
*创build主窗口
*创build模型
*连接控制器到模型和主窗口
*显示主窗口
*(在这里保存模型,控制器和主窗口到私人领域,以确保他们都保持活着)

6.将样式(颜色,字体)添加到ResourceDictionary下的单独XAML文件(使用混合或购买现成的XAML主题/皮肤文件)。

希望用C#而不是XAML编写用户界面的冲动实际上仅仅是您在XAML中感觉如何的体现。

对我来说,写一个尽可能less的代码隐藏是个人的目标。 简而言之,后面的代码很难进行unit testing,但是可以(通常也包括)没有经过testing的逻辑。 XAML是声明式的(如HTML),不包含任何逻辑,所以没有任何unit testing。 我保持我的视图代码在XAML,并保持我的视图逻辑在我的ViewModel(MVVM),这是很容易testing。

一旦您对XAML变得更加熟悉,就越会意识到它在程序代码中的视图构造方面的优势。使用像MVVM这样的模式,您会更进一步,并意识到代码隐藏仅在极less数情况下才有用。

最重要的是要记住XAML是为了演示。 所有的演示文稿应该在XAML中。 如果你有逻辑,你可以把它保留在你的XAML中 – 在你的C#中。

想象一下,将您的XAML文件换成完全不同的XAML文件 – 但仍然使用相同的数据 – 这是该部门应该在哪里。

XAML的好处之一是将表示和逻辑分开。 这种分离不仅仅是理论上的,也是实用的。 我的情况是,我的大多数UI现在都由devise师来处理。 这个devise师使用混合,并不知道C#,没有学习C#的兴趣,坦率地说,不需要。 这个devise师是一个真正的devise师,一个艺术家,知道如何使用这些工具,使事情看起来真的很好。 基本上我的phylosipy是这样的,我使用XAML越多,我必须在UI上做的工作越less,因为他可以做到这一点。 这对我们运作良好。 我通常devise我的控制是无形的,给他们一个基本没有褶边的样子,使用DataContext绑定我的对象(顺便说一句DataTriggers是减less代码的好方法)。 因此,我会经常检查我的代码,第二天回来,同步它,UI将看起来完全不同,但一切仍然工作!

当然,至less要花一年半的时间才能到达那里,但是现在这个模型似乎可以工作,我们的用户界面看起来像Kick A ##,我们的应用程序赢得了很高的评价,而且我在UI上做的工作也很less,更酷的东西。 长话短说,我认为背后的代码可能会更加以开发人员为中心,忘记了一个可以利用WPF,也就是devise人员获益,修整和谋生的整个团队。

当然,还有一段时间需要开发者来让XAML / WPF唱歌跳舞,有时候我们需要教育devise师正确的做事方式,但是我认为它的投资价值得到了很多的回报大型项目(也许不是那么简单)

XAML,MXML所有这些东西工作,只要你正在开发一个简单的用户界面,一些平均复杂性。 一旦你的用户界面变得越来越复杂和丰富,自动数据绑定将带来更多的麻烦而不是他们的好处。 XAML的目的不是让编程变得容易,而是把逻辑从UI分离出来,使UI的工具变得简单。

没有数据绑定,没有事件处理程序..假设你永远不会再看到你的XAML和写代码..

XAML是介绍。 数据绑定不是演示文稿。 其表示逻辑。 将所有表示逻辑放在代码后面(数据绑定和处理程序)。 开发人员拥有自己的代码,devise师拥有XAML。 如果您是开发人员,并且如果您正在接触XAML,则将该部分移到代码后面。

我们也可以在不使用XAML的情况下编写WPF应用程序

感谢Vinoth Kumar R(已经足够使用Flex MXML数据绑定)

这不仅仅是关于你,也是关于你的团队,其中一些可能是devise师。

如前所述,XAML和C#是将逻辑和devise分开的一个非常好的方法。

对于一个典型的程序员来说,编程的方式实际上是通过使用WPF来改变的,假设程序员来自C ++,VB,WinForms,ATL和MFC背景,UI的背景与XAML和C#。

要习惯这种编程方式需要一些时间,但是越来越多的经验会变得非常有效。

在开始之前,学习MVVM模式和运行教程以了解模式的强度以及理解其优点是非常好的。

基于MVVM模式优点的WPF和C#应用程序:

1.用户实验和可用性从UI分离逻辑,使得更自然地有一个专门的devise师在UIdevise和animation工作。 这样,程序员可以专注于背后的逻辑和技术解决scheme,而UI是由知道devise的人devise的。 这对于许多软件公司来说是一个问题,至less在业内,程序员实际上是曾经devise过UI,并且已经产生了大量的支持,维护和有效的应用。

有一个更高的可能性,它结束了更多的用户友好的应用程序,有一个可用性背景的人关注的是使用而不是技术解决scheme。 这里有一个非常有趣的书,这个例子,Joel Spolsky编写的用于程序员的用户界面devise。

通过在XAML应用程序中使用MVVM模式,我们将很有可能看到更多的用户易用应用程序。

2.维护维护,在软件开发中花费很大。 它可以感觉到,MVVM模式在开始时是一个很大的开销,但是在添加函数的同时,越复杂和先进的应用程序越是获得更多的好处。 你会发现维护这样的应用程序真的很容易。 有关概览,您可以查看此video:

3.能力的结合专业的devise师和一个团队中的专业程序员取得更好的结果是一个很好的混合能力的方法。 而不是只雇用程序员,组织需要结合能力来提供最好的结果。

4.devise感兴趣的程序员的机会最后,可以在Windows环境中实现花哨的应用程序。 如果您是一位对devise感兴趣的程序员,Microsoft Expression Blend确实为开发人员提供了一个很好的devise,可以帮助他们学习和创build出色的,有用的应用程序。

虽然可以冒险使用XAML和C#,MVVM,但它提供的巨大可能性和灵活性也可能是一个缺点。 让程序员放松这个新的简单的用户界面环境,应用程序可能会结束了广泛的animation,颜色,新环境提供的一切。 回想一下在C ++和ATL环境中如何添加UI控件。

仍然有更多的好处,我希望你得到一些灵感,使用XAML而不是C#的用户界面,适应时,我相信你会喜欢它。

一个好的tuturial的链接: 教程MVVM XAML C#

我原本来自Web开发的一面,现在正在学习WPF / Silverlight。 对我来说,XAML模型比WinForms更有意义。 我把XAML看作是HTML和.cs文件就像一个代码隐藏。

我爱干净的代码,我有更less的代码,更清洁。 代码可以用数百万种方式编写,XAML更具限制性。 XAML当然适合在适当的时候减less代码。 如果我能把一些东西放在XAML中,我会去做的。 工具可以读取XAML并使用它进行操作。 更less的代码。 处理XAML的工具和框架将会发展并变得更好,与现有的XAML做更多更好的工作。 不能说关于代码。 XAML越发展,我们越能够声明性地定义我们的应用程序。

对我来说,使用XAML就像使用LINQ一样。 如果我可以写一个容易阅读的单行语句,并让框架决定实现我想要的最佳方式,我感觉很好。 我绝对尽可能地尝试使用我想要的声明,而不是硬编码如何完成。 F#是这个范例的另一个很好的例子。

不pipe你在计算机编程中使用哪种编程语言,所有的逻辑都应该在代码中。 即使在ControlTemplate中,XAML也不应该replace,尽pipe它很好,但是unit testing和debugging代码要简单得多。

有些东西在代码中更容易维护或debugging。

不要提及,你将能够在Xaml2009中做更多的事情,现在必须在代码中完成。

不幸的是,BAML在2010年的时间框架中不会完全支持xaml 2009,所以你不能在2010年的时间框架内编译xaml。 而且将不得不等待更高版本的混合来完成完整的开发devise循环。 (晚于3)

道格拉斯

XAML可以被看作是类似于结构和devise所使用的XHTML和CSS或XML和XSL的组合。 任何forms的逻辑都应该在C#中。 这样的结构和devise是从逻辑分离。 使用这种方法你的代码也应该更干净。 另一个积极的事情是,devise者和程序员之间的任务可以更容易分开。

还有一件事…这是从MSDN的XAML的定义:

可扩展应用程序标记语言(XAML)是用于声明式应用程序编程的标记语言。 Windows Presentation Foundation(WPF)实现了可扩展应用程序标记语言(XAML)加载程序,并为Windows Presentation Foundation(WPF)types提供了可扩展应用程序标记语言(XAML)语言支持,以便您可以在可扩展应用程序标记语言(XAML)标记。 另外,SDK包含一个名为XAMLPad的可扩展应用程序标记语言(XAML)编辑工具。 您可以使用此工具实时testing可扩展应用程序标记语言(XAML)。

链接到报价。

在C#中用stream畅的样式编程WPF有助于减less代码的大小和复杂性。 有关WPF使用stream畅样式的示例,请参阅此答案 。

似乎没有答案提到一个重要的一点呢: https : //msdn.microsoft.com/en-us/library/windows/apps/xaml/hh465340.aspx

XAML只是程序代码(更容易)

 <Grid x:Name="ContentPanel" Margin="12,0,12,0"> <Button Height="72" Width="160" Content="Click Me" /> </Grid> 

“下面展示了如何将这个XAML部分地replace成用C#或Visual Basic编写的代码。”

 // Initialize the button Button myButton = new Button(); // Set its properties myButton.Width = 160; myButton.Height = 72; myButton.Content = "Click Me"; // Attach it to the visual tree, specifically as a child of // a Grid object (named 'ContentPanel') that already exists. In other words, position // the button in the UI. ContentPanel.Children.Add(myButton); 

例如,如果您使用Windows窗体,您可能还记得Windows窗体devise器生成一个.designer.cs文件,其中包含类似于上述链接示例的代码。 这种声明性代码在XAML中比在C#中performance得更好。

对于任何非玩具应用程序,您总是应该首选XAML来定义UI,并以MVVM方式将其连接到逻辑。