8

WinRT と WP8 の間でコードを共有する場合:

WP8 は次のことを望んでいます。

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

WinRT は次のことを望んでいます。

xmlns:vm="using:MyApp.ViewModels" 

つまり、WP7、Silverlight、WPF のようにプロジェクト間で XAML コード (ユーザー コントロールなど) を共有することはできません。

誰かが回避策を見つけましたか? XmlnsDefinition属性でこれを修正できるように見えましたが、MS は WinRT から削除しました。

4

2 に答える 2

1

この問題と限定的な回避策については、http: //msdn.microsoft.com/en-us/library/windowsphone/develop/jj714088 (v=vs.105).aspxで詳しく説明されています。

  • Windows Phone 8 の XAML と Windows 8 の XAML はバイナリ互換ではありません。前述のように、各プラットフォームで UI を構築するために使用するコントロールは似ています。これらは、名前、動作、プログラミング インターフェイス、または公開する構文が似ています。ただし、これらは各プラットフォーム専用に実装されています。
  • Namespace prefixes are different in XAML for Windows Phone 8 and XAML for Windows 8. これは、基本ページを最初から作成するときに含まれる名前空間を見るとわかります。[...] これらの名前空間のインポートを比較すると、名前空間のインポート方法に微妙ではあるが大きな違いがあることがわかります。Windows Phone 8 では、インポートされた名前空間には clr-namespace: というプレフィックスが付きます。Windows 8 では、インポートされた名前空間には using: というプレフィックスが付けられます。これにより、同じ構文を使用して名前空間をインポートできない限り、同じ XAML を使用することが難しくなります。
  • XAML は条件付きコンパイルをサポートしていません。プリプロセッサ ディレクティブを使用した条件付きコンパイルに示されているように、条件付きコンパイルは、特定のプラットフォームを対象とするコード パスでコンパイルし、別のプラットフォーム用にコンパイルする場合は別のコード パスでコンパイルすることにより、プラットフォームの違いを処理するための便利な手法です。これにより、両方のプラットフォーム間で XAML ページを共有することが困難になります。これは、Windows Phone 8 の clr-namespace を使用し、Windows 8 の場合: を使用する名前空間のインポートで条件付きでコンパイルするだけでは、前の問題に対処できないためです。

これは、Windows Phone 8 と Windows 8 の間で共有するための完全な障害と見なされるべきではありません。明確なガイダンスは、プラットフォームごとに個別に UI を設計および構築し、それぞれの設計ガイドラインを採用することです。これらの障害を回避することは技術的に可能です。ページの初期化中にコードから UI を作成できます。実行時にリソースからプラットフォーム固有の XAML を読み込み、それを文字列としてページに挿入できます。ただし、これらの手法はどれも拡張性がなく、コア アセットの構築 (アプリがユーザーにどのように見えるか) は、退屈でエラーが発生しやすい作業になります。コード共有への投資は、アプリ ロジック、データ モデル、ビューモデルなどを共有しようとすることで、アプリ スタックのさらに下にあるはるかに大きな利益をもたらします。

[...] 状況によっては UI を共有するためのテクニックの 1 つは、UI の一部をユーザー コントロールに分離し、それらを共有しようとすることです。[...] ただし、この説明の冒頭で述べた制限により、この手法は基本的なユーザー コントロールに限定されます。これらの制限に加えて、常にターゲット プラットフォームに合わせてユーザー エクスペリエンスを構築するためのガイドラインを考慮する必要があります。XAML コントロールの共有は可能ですが、制限があります。この種の共有に適しているのは、ポップアップ ウィンドウに表示したい UI や、共有したいその他のウィジェットです。それらは通常、複雑な XAML を使用せず、シンプルなスタイルを使用した基本的な UI 要素で構成されているためです。

于 2014-02-26T00:15:36.900 に答える