プラットフォーム依存コード
Uno PlatformがUWP互換APIを提供してくれるとはいうものの、まだすべてのAPIを完全にカバーできてはいません。例えば、本稿執筆時点では、WebViewコントロールはiOSとWebAssemblyでは上手く動かせませんでした。Windows 10のAcrylic(半透明)テーマを指定すると、UWP以外のプラットフォームでは実行時に例外を出して終了してしまいました。また逆に、UWPには存在しないプラットフォーム固有の機能を使いたいこともあるでしょう。
そのようなプラットフォームに依存するコードが必要になるのは、クロスプラットフォーム開発の宿命ともいえます。
プラットフォーム依存のXAML
プラットフォームのプレフィックスを付けることで、プラットフォームごとに異なるXAMLを定義できます。属性でも、要素そのものでも可能です。
Pageタグの中に、例えば次のコードのようにしてプレフィックスを定義します。UWP以外の(つまり、Android/iOS/WebAssembyの、またはそれらを複合した)プレフィックスをmc:Ignorableのリストに忘れずに追加してください。利用できるプレフィックスの一覧は、「Platform-specific XAML markup in Uno」をご覧ください。
<Page x:Class="UF15.MainPage"
……省略……
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:win="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:not_win="http:/uno.ui/not_win"
xmlns:android="http://uno.ui/android"
xmlns:ios="http://uno.ui/ios"
xmlns:wasm="http://uno.ui/wasm"
mc:Ignorable="d not_win android ios wasm">
上のプレフィックスを使って、例えば次のコードのようなXAMLが書けます。
<StackPanel>
<TextBlock Margin="20" FontSize="30" Text="Hello, Uno !"
win:Foreground="DodgerBlue"
android:Foreground="LimeGreen"
ios:Foreground="BlueViolet"
wasm:Foreground="OrangeRed"
/>
<win:AppBarButton Icon="People" Label="UWP" />
<not_win:Button Margin="20,0"
android:Content="Android"
ios:Content="iOS"
wasm:Content="WebAssembly"/>
</StackPanel>
上のXAMLでは、TextBlockのForeground(=文字色)をプラットフォームごとに変えています。また、UWPではAppBarButtonを表示し、それ以外のプラットフォームでは普通のButtonにしています(AppBarButtonのシンボルアイコンはUWPだけで有効です)。そのButtonに表示する文字も、プラットフォームごとに変えています。実行すると次の画像のようになります。
なお現在のところ、AndroidやiOSのネイティブコントロールをXAMLで記述することはできないようです。次に説明するパーシャルクラスを使ってC#のコードで実装します。詳しくは「Platform-specific C# code in Uno」をご覧ください。
