花粉がつらい今日この頃です。
Sharedプロジェクト
まずは基本です。Universal Windows appでは、SharedのプロジェクトにおいたコードはWindowsストアアプリとWindows Phone アプリで共有されます。
このときXAMLもC#も共有されます
プラットフォーム固有のXAML
でも、プラットフォーム固有の処理や見た目を定義したいことがありますよね。ページはそのまま個別に作ればいいですが、リソースてきなXAMLは両方のプロジェクトに同じ名前で作成してApp.xamlで読み込みましょう。
こんな風にPlatformDictionary.xamlを両方のプロジェクトに作って…
App.xamlで読み込む。これでWindows ストア アプリのときはストアのプロジェクトのやつを読み込んで、電話のときは電話のプロジェクトのやつを読み込みます。
<Applicationx:Class="App33.App"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="using:App33"><Application.Resources><ResourceDictionary><ResourceDictionary.MergedDictionaries><ResourceDictionary Source="PlatformDictionary.xaml" /></ResourceDictionary.MergedDictionaries></ResourceDictionary></Application.Resources></Application>
コントロールのスタイルとか、DataTemplateに効果を発揮しますね。
partialクラス
ビルドしたアセンブリが共有されるのではなく、コードが共有されてビルド時によきにはからってくれるという仕組みなので、パーシャルクラスが使えます。以下のようなクラス配置で。
Person.cs
using System; using System.Collections.Generic; using System.Text; namespace App33 { publicpartialclass Person { publicstring Name { get; set; } } }
WPA側Person.partial.cs
using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; namespace App33 { publicpartialclass Person { publicvoid Greet() { Debug.WriteLine("Hello Windows phone!!"); } } }
Windows store app側Person.partial.cs
using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; namespace App33 { publicpartialclass Person { publicvoid Greet() { Debug.WriteLine("Hello Windows store app!!"); } } }
こんな風にメソッド全体が違う場合はパーシャルクラスを使うことができます。まぁでもこの後紹介する#ifディレクティブのほうがIDE支援は強いので、そっちが使うのがいいかも?
#ifディレクティブ
WINDOWS_APP, WINDOWS_PHONE_APPという定数があるので、それで#if ~ #endifでくくることでプラットフォーム固有の処理を書けます。
partialの例を#ifディレクティブになおすとこんな感じのコードになります。
黄色いマーカーで示してるところでプロジェクトを切り替えると、そっちのプロジェクトでは無効なコードがグレーアウトされます。