【问题标题】:XAML clr-namespace - using incompatibility?XAML clr-namespace - 使用不兼容?
【发布时间】:2013-05-06 19:43:48
【问题描述】:

在 WinRT 和 WP8 之间共享代码时:

WP8 想要:

xmlns:vm="clr-namespace:MyApp.ViewModels" 

WinRT 想要:

xmlns:vm="using:MyApp.ViewModels" 

这意味着您不能像在 WP7、Silverlight、WPF 中那样在项目之间共享 XAML 代码(如用户控件)

有没有人找到解决方法? XmlnsDefinition 属性看起来可能会解决此问题,但 MS 将其从 WinRT 中移除。

【问题讨论】:

  • XAML 共享只能在 WP7/SL/WPF 之间通过在每个项目中实际维护 XAML 文件的单独副本来实现,因此“共享”有点用词不当。随着可移植类库的出现,这种情况实际上有所改变,尽管您仅限于使用所有目标平台上存在的类型和方法。在这种情况下,由于共享只是“复制文本”类型,您可以继续这样做(除了您需要调整 WinRT 的“使用”。)
  • 您不需要复制文件,只需将它们添加为链接文件,因此您只需维护一个文件。有了这种改变,这显然是不可能的了。
  • 实际上,在 WP7/SL/WPF 中,如果您坚持基本控件,您可以共享 XAML。诀窍是将您的主要 xaml 放在用户控件中。然后可以将用户控件作为链接共享到每个 VS 项目中。然后在包含用户控件的每个项目中定义一个页面或窗口或任何内容。

标签: silverlight windows-phone-7 xaml windows-runtime windows-phone-8


【解决方案1】:

这里详细解释了这个问题以及有限的解决方法:http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj714088(v=vs.105).aspx

  • Windows Phone 8 上的 XAML 和 Windows 8 上的 XAML 不兼容二进制。如前所述,用于构建 UI 的控件 在每个平台上都是相似的。它们在名称、行为和 它们公开的编程接口或语法。然而,他们是 专门针对每个平台实施。
  • Windows Phone 8 的 XAML 和 Windows 8 的 XAML 中的命名空间前缀不同。这可以通过查看命名空间来说明 从头开始创建时包含在基本页面中。 [...] 比较这些命名空间导入,您可以看到微妙但 命名空间的导入方式存在显着差异。在 Windows 中 电话 8,导入的命名空间以 clr-namespace: 为前缀。在 Windows 8 导入的命名空间以 using: 为前缀。这使它 很难使用相同的 XAML,除非您可以使用 相同的语法。
  • XAML 不支持条件编译。作为 显示在使用预处理器指令的条件编译中, 条件编译是处理平台的有用技术 通过在针对特定目标的代码路径中编译的差异 平台,以及为另一个平台编译时的另一个代码路径。 这使得在两个平台之间共享 XAML 页面变得困难, 因为你不能简单地通过有条件地解决上一个问题 在使用 clr-namespace for Windows 的命名空间导入中编译 电话 8 和使用:适用于 Windows 8。

这不应被视为在 Windows Phone 8 和 Windows 8。明确的指导是设计和 为每个平台单独构建你的 UI,拥抱设计 每个指南。技术上可以绕过这些 障碍。您可以在页面初始化期间从 代码。您可以在运行时从资源中加载特定于平台的 XAML 并将其作为字符串注入页面。然而,这些都没有 技术规模,它们使您的核心资产的建设 - 如何 你的应用看起来是你的用户——一项乏味且容易出错的任务。你的代码 分享投资会给你更大的回报 您的应用程序堆栈,通过尝试共享应用程序逻辑、数据模型、视图模型, 等等

[...] 在某些情况下可以使用的一种共享 UI 的技术 是将你的 UI 的一部分隔离到用户控件中并尝试共享 那些。 [...] 但是,由于在 本讨论开始时,该技术仅限于基本用户 控制。除了这些限制之外,您还应该考虑 始终构建适合目标的用户体验的指南 平台。共享 XAML 控件是可能的,但受到限制。一个好的 这种共享的候选对象是您想要显示在 您想要共享的弹出窗口或其他小部件,因为它们 通常由基本的 UI 元素组成,没有复杂的 XAML 并具有简单的样式。

【讨论】:

    【解决方案2】:

    我刚刚在 Windows Phone 8 中做了一点操作,虽然编辑器默认将其转换为 clr-namespace,但您仍然可以将其更改为 using,它会起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-09
      • 2016-11-29
      • 1970-01-01
      • 2013-02-02
      • 1970-01-01
      • 1970-01-01
      • 2012-06-17
      相关资源
      最近更新 更多