利用できないUWP APIについて
公式ドキュメントによる解説
残念ながらすべてのUWP APIを.NET Frameworkのアプリから利用できるわけではありません。大雑把にいうと、次のようなAPIは利用できません。
【利用できないUWP API】
- 主にUI用のAPI
- 内部的にUWPパッケージのIDを利用しているAPI(UWPパッケージ化すれば利用可)
1つめのグループは、厳密にいうと型定義にDualApiPartition属性が付けられていないAPIです(MicrosoftのAPIドキュメントのクラスなどのページに、付与されている属性一覧が掲載されています)。UI用コントロール類の他に、前回のIsApiContractPresentなどが含まれます。
型定義にDualApiPartition属性が付いているAPIでも、使えないものがあります。それが2つめのグループです。UWPアプリのパッケージ(「.appx」ファイル)に付けられているパッケージIDが、APIの動作に必要な場合があります。そのようなAPIは、.NET Frameworkのアプリからは利用できません(ただし、デスクトップ ブリッジでUWPパッケージに変換すれば、従来のデスクトップアプリからも利用できます)。
実際は、かなりあやふや
以上が公式なドキュメントに基づく説明になります。でも、APIの動作にパッケージIDが必要かどうかはドキュメントに書かれていないようですし、DualApiPartition属性が付いていないAPIでも使えることがあります(今回のふりがな用APIもそうです)。結局のところ、「試してみないと分からない」ということになりそうです。 なお、「パッケージ デスクトップ アプリで利用可能な UWP API (デスクトップ ブリッジ)」に利用できるUWP APIの一覧が載っているのですが、不完全です(例えば、本稿執筆時点では、パッケージIDを必要とするWindows.Storage.ApplicationDataがデスクトップアプリからも利用可能な方に分類されています)。
ちなみに、利用できないAPIを呼び出そうとすると、次の画像のようになります(Visual Studio 2015)。
読み仮名を取得するAPIの使い方
今回のコードで利用しているUWPのAPIは、Windows.Data.Text名前空間のものです。サンプルコードのMainWindow.xaml.csの後半、TextBox_TextChangedメソッドから追いかけてください。
- TextReverseConversionGenerator:読み仮名を取得するクラス
- TextConversionGenerator:読みから漢字かな混じり文字列の候補を取得するクラス
- TextPhoneme:音素(形態素)を表すクラス(1607/14393以降)
文字列全体の読み仮名を取得する
TextReverseConversionGeneratorのConvertBackAsyncメソッドを使います(次のコード)。これを使って例えば、リストの並べ替えを日本語の読み仮名順にすることなども簡単にできますね。
string inputText = ……省略…… // 読み仮名を取得するためのクラス var trcg = new Windows.Data.Text.TextReverseConversionGenerator("ja"); // 文字列全体の読み仮名を取得する(Win10全バージョン) var yomi = await trcg.ConvertBackAsync(inputText);
ふりがな用に形態素ごとの読みを取得する(1607/14393以降)
TextReverseConversionGeneratorのGetPhonemesAsyncメソッドを使います(次のコード)。形態素ごとに分割されて、TextPhonemeオブジェクトのコレクションとして結果が返ってきます。TextPhonemeには分割した元の文字列(DisplayTextプロパティ)とその読み(ReadingTextプロパティ)が入っています。元の文字列と読みが異なっている場合は漢字が含まれているのだと判断できます。
string inputText = ……省略…… // 読み仮名を取得するためのクラス var trcg = new Windows.Data.Text.TextReverseConversionGenerator("ja"); // 形態素分解して読み仮名を個別に取得する(14393以降) IReadOnlyList<Windows.Data.Text.TextPhoneme> textPhonemeList = await trcg.GetPhonemesAsync(inputText); foreach (var phoneme in textPhonemeList) { string text = phoneme.DisplayText; // 元の文字列を分解したもの string ruby = phoneme.ReadingText; // その読み if(text != ruby) { // rubyを振り仮名として処理する } }
カナ漢字変換の候補を取得する
TextConversionGeneratorのGetCandidatesAsyncメソッドを使うと、ひらがなの文字列をカナ漢字変換したときの候補一覧が得られます(次のコード)。実際のIMEによる変換候補とは異なるようです。
string yomi = ……省略…… // 読み仮名から漢字に変換(Win10全バージョン) var tcg = new Windows.Data.Text.TextConversionGenerator("ja"); IReadOnlyList<string> candidatesList = await tcg.GetCandidatesAsync(yomi);
形態素解析に特化したAPI
UWPのAPIには、Windows 8.1からのJapanesePhoneticAnalyzerクラス(Windows.Globalization名前空間)というものもあります。
JapanesePhoneticAnalyzerは、TextReverseConversionGeneratorと違って形態素解析だけに特化していて、2種類の解析モードを持っています。しかし、文字列全体の読み仮名は返してくれませんので、読み仮名を得るには形態素ごとの読みをいちいち連結する必要があります。また、入力中の半角英字を全角に変換してくれてしまうという困った仕様も持っています(TextReverseConversionGeneratorも同様でしたが、14393あたりから半角英字は半角のまま出力されるように変わりました)。
JapanesePhoneticAnalyzerで読み仮名を得る方法は、筆者のサンプルコードをご覧ください。