wpf - Windows 8 运行时(WinRT/Windows 应用商店应用/Windows 10 通用应用)与 Silverlight 和 WPF 相比如何?

标签 wpf windows-runtime windows-store-apps windows-10 win-universal-app

就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the help center为指导。




9年前关闭。




我正在尝试了解用于创建 Metro 的新 Windows 8 运行时风格的应用程序。我知道您可以通过 XAML 使用它它基于 .NET,因此可以使用 C# 和 VB.NET 来编写应用程序,但它似乎与 HTML、CSS、DOM 和 JavaScript 有关。

有人可以用 .NET UI 程序员可以理解的方式用几段来解释它是什么吗? (我错过了理解它所必需的“关键”。)

众所周知,WPF,Silverlight , Windows Forms等将至少在英特尔系统上继续在 Windows 8(和 Windows 10)下工作,所以请不要告诉我......

最佳答案

在最低级别,WinRT 是在 ABI 级别定义的对象模型。它使用 COM 作为基础(因此每个 WinRT 对象都实现 IUnknown 并进行引用计数),并从那里构建。与旧的 COM 相比,它确实添加了相当多的新概念,其中大部分直接来自 .NET - 例如,WinRT 对象模型具有委托(delegate),并且事件以 .NET 样式完成(具有委托(delegate)和添加/删除订阅者)方法,每个事件一个)而不是事件源和接收器的旧 COM 模型。在其他值得注意的事情中,WinRT 还具有参数化(“通用”)接口(interface)。

另一个重大变化是所有 WinRT 组件都有可用的元数据,就像 .NET 程序集一样。在 COM 中,类型库有点类似,但并非每个 COM 组件都有。对于 WinRT,元数据包含在 .winmd 文件中 - 在 Developer Preview 中查看“C:\Program Files (x86)\Windows Kits\8.0\Windows Metadata\”。如果你四处看看,你会发现它们实际上是没有代码的 CLI 程序集,只是元数据表。事实上,您可以使用 ILDASM 打开它们。请注意,这并不意味着 WinRT 本身是受管理的 - 它只是重用文件格式。

然后根据该对象模型实现了许多库 - 定义 WinRT 接口(interface)和类。再次,查看上面提到的“Windows Metadata”文件夹,看看里面有什么;或者直接在 VS 中启动对象浏览器并在框架选择器中选择“Windows 8.0”,以查看所涵盖的内容。那里有很多,它不单独处理 UI - 您还可以获得 namespace ,例如 Windows.Data.Json , 或 Windows.Graphics.Printing , 或 Windows.Networking.Sockets .

然后你会得到几个专门处理 UI 的库——主要是 Windows.UI 下的各种命名空间。或 Windows.UI.Xaml .其中很多与 WPF/Silverlight 命名空间非常相似 - 例如Windows.UI.Xaml.Controls紧密匹配 System.Windows.Controls ;同上 Windows.UI.Xaml.Documents等等。

现在,.NET 能够直接引用 WinRT 组件,就像它们是 .NET 程序集一样。这与 COM Interop 的工作方式不同 - 您不需要任何中间工件,例如互操作程序集,您只需 /r .winmd 文件,并且其元数据中的所有类型及其成员都对您可见,就好像它们是 .NET 对象一样。请注意,WinRT 库本身是完全 native 的(因此使用 WinRT 的 native C++ 程序根本不需要 CLR)——将所有这些内容公开为托管内容的神奇之处在于 CLR 本身,并且是相当低的级别。如果您编写了一个引用 .winmd 的 .NET 程序,您会发现它实际上看起来像一个外部程序集引用 - 那里没有诸如类型嵌入之类的花招。

这也不是一个简单的映射 - CLR 会尽可能将 WinRT 类型调整为对应的类型。所以例如GUID、日期和 URI 变为 System.Guid , System.DateTimeSystem.Uri , 分别; WinRT集合接口(interface)如IIterable<T>IVector<T>成为IEnumerable<T>IList<T> ;等等。这是双向的 - 如果您有一个实现 IEnumerable<T> 的 .NET 对象,并将其传递回 WinRT,它会将其视为 IIterable<T> .

最终,这意味着您的 .NET Metro 应用程序可以访问现有标准 .NET 库的子集,以及( native )WinRT 库,其中一些 - 特别是 Windows.UI - 在 API 方面看起来与 Silverlight 非常相似。您仍然使用 XAML 来定义您的 UI,并且您仍然处理与 Silverlight 中相同的基本概念 - 数据绑定(bind)、资源、样式、模板等。在许多情况下,可以通过 using 简单地移植 Silverlight 应用程序。新的命名空间,并在代码中调整了 API 的一些地方。

WinRT 本身与 HTML 和 CSS 没有任何关系,它与 JavaScript 的关系只是在某种意义上它也暴露在那里,类似于它在 .NET 中的处理方式。当您在 .NET Metro 应用程序中使用 WinRT UI 库时,您不需要处理 HTML/CSS/JS(好吧,我想,如果您真的想要,您可以托管 WebView 控件...)。您所有的 .NET 和 Silverlight 技能在此编程模型中仍然非常重要。

关于wpf - Windows 8 运行时(WinRT/Windows 应用商店应用/Windows 10 通用应用)与 Silverlight 和 WPF 相比如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7416826/

相关文章:

c# - Windows Store App ListBox 的 PreviewKeyDown

windows - Powershell Windows 应用程序获取发布者显示名称

c# - WPF TextBoxBase(System.Windows.Controls.Primitives) 获取文本

c# - 如何从 View 模型中触发对 View 中对象的方法调用

C#/WPF : Drag & Drop Images

c# - 如何在 c#/xaml Windows 商店应用程序中将 RTF 文件注入(inject) RichTextBlock

wpf - ValidationRules 没有绑定(bind)

c# - 如何读取文件 (Metro/WinRT)

javascript - 解析数据馈送导致 WinJS 中出现无效字符错误

wpf - 从 Installshield 更改 UWP 应用的安装位置