プラットフォーム依存コード
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」をご覧ください。
この記事は参考になりましたか?
- UWPアプリ開発の最前線連載記事一覧
-
- SQLiteデータベースがWebアプリでも使える! ~Uno Platformクロスプラッ...
- UWPアプリを書けばiOS/Android/Webでも動く!? ~Uno Platform...
- Windows電卓の中はどうなっているのだろう?(後編) ~オープンソースのコードを改造し...
- この記事の著者
-
biac(ばいあっく)
HONDA R&Dで自動車の設計をやっていた機械屋さんが、技術の進化スピードに魅かれてプログラマーに。以来30年ほど、より良いコードをどうやったら作れるか、模索の人生。わんくま同盟の勉強会(名古屋)で、よく喋ってたりする。2014/10~2019/6 Microsoft MVP (Windows Devel...
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア
