プラットフォーム依存コード
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」をご覧ください。