WPF应用程序需要使用XAML吗?

5
我想学习C#,但似乎每个人都在从使用WinForms转向使用WPF。对我来说,由于使用.XAML文件来构建表单,WPF应用程序似乎更加复杂。
在我深入学习之前,我想问一下,XAML文件是构建WPF应用程序的唯一方法吗?是否有更简单的方法?我知道我可以学习使用WinForms,因为你基本上只需要使用一个Form对象来编写代码,但是如我所提到的,我认为构建WPF应用程序最好。

4
如果你喜欢WinForms,就继续使用它。不要因为它流行就去换别的,只有当你从中获得了一些好处时再考虑切换。 - JohnFx
如果你打算学习WPF,我会推荐MSDN作为好的资源。在WPF概述及其链接的所有页面中,你可以找到最重要的知识点。 - H.B.
5个回答

11
如果你知道如何使用XAML,它确实可以让事情变得更容易,因为它更易读且声明性更强,但是如果你愿意,你也可以在C#代码中做(几乎)任何事情。
例如:
<Border BorderBrush="Red">
    <TextBlock Text="Lorem Ipsum"/>
</Border>

vs.

var border = new Border();
border.BorderBrush = Brushes.Red;
var textBlock = new TextBlock();
textBlock.Text = "Lorem Ipsum";
// The following step is implicit in XAML via the structure
border.Child = textBlock;

虽然这可以更简洁和分层地写成:
new Border
{
    BorderBrush = Brushes.Red,
    Child = new TextBlock
    {
        Text = "Lorem Ipsum"
    }
};

通常我会建议使用XAML,原因包括:
  • 解析器根据WPF的布局系统优化了树的构造。
  • 不支持在代码中创建DataTemplates。使用FrameworkElementFactories进行构造已被弃用,取而代之的是使用XamlParser(我绝对不建议在代码中搞弄XAML字符串)。
  • UI和代码之间的分离。

5

XAML并非构建WPF应用程序的唯一方法。在通过几个工具运行XAML之后,它自身被转换为C# / IL,这些代码用于实际构建UI。没有什么阻止你手写完全相同的代码并构建WPF表单。

然而,我要警告你考虑不采取此方法。 XAML当然是构建WPF应用程序的首选工具。它将出现在绝大部分网络示例中。手写WPF应用程序的示例要少得多。


1
你知道怎么说XAML被转换成IL吗?它被转换成BAML。你能确认一下吗? - Jasmine

3

是的,你可以编写纯WPF代码,但我不建议这样做。

Petzold的书《Application = Code + Markup》在使用XAML之前会先向你介绍如何使用纯WPF。这本书二手市场上很容易找到,你还可以在官网上查看示例代码。此外,该书也可以在线阅读,如果你有试用账户,可以免费阅读几周。相比于其他书籍中大量使用XAML的方式,《Application = Code + Markup》试图通过教授无XAML的WPF来让你更好地理解。

VS2010中的可视化编辑器要比之前的版本好得多,因此你不一定需要了解太多的XAML就能创建界面。我还建议尝试使用Expression Blend工具,看看是否能习惯其“设计师”式的创建界面方法。

在WPF中,你可以在任意位置进行操作。我采用更加侧重于代码的方式,在XAML中只处理布局和样式,数据和命令的绑定则通过代码实现。这样可以使XAML更加简洁,避免了在XAML中指定绑定的一些细节,为了方便学习,我建议从这种方式开始。

我还建议你使用MVVM模式,并使用像MVVMLite这样的框架,它会为你提供许多基础设施,并有助于分离GUI和逻辑。


2

虽然你可以在代码后端构建一切,但XAML是构建WPF应用程序的简单方法。以这种方式做事情还有助于将视图与程序逻辑分离。理想情况下,一个WPF开发团队至少应该包括一名负责XAML(或视觉方面)的程序员/设计师。他们将制作动画和其他视觉元素。还应该有至少一名“普通”开发人员负责编程逻辑和数据模型类型等事务。当然,这不是一个理想的世界。


2

不,你不必这样做,但正如@H.B.所说,这会使它更容易。

如果你使用像Visual Studio这样的IDE,就像WinForms一样,你有一个设计师加上Expression Blend。如果你发现XAML一开始很难理解,也许可以先玩一下那个,而不是直接进入XAML。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接