WPF で読みがなを取得(3)

テキストボックスに入力された日本語の文章や固有名詞(名前など)から読み仮名を取得する方法について、Microsoft から提供されている “Microsoft Visual Studio International Feature Pack 2.0” に含まれている “YomiganaWPFTextBox” コントロールを利用する方法を以前書きましたが、ユニバーサル Windows プラットフォーム用の API をデスクトップアプリケーションから利用する方法があり、この方法を使うことで Windows.Globalization 名前空間の JapanesePhoneticAnalyzer クラスが利用できることから、追加で記事を書いておきます(使い方の紹介だけなので、特に内容はありません)。

ユニバーサル Windows プラットフォーム用の API をデスクトップ アプリケーションから利用する方法については、okazuki さんの「UWPのAPIをDesktopアプリから呼び出す」が参考になります。
Windows.Globalization 名前空間の JapanesePhoneticAnalyzer クラスの利用方法については、@IT の「日本語の読み仮名を取得するには?[UWPアプリ開発]」が参考になります。

説明だけなら以上で終わっちゃうんですが、それではあんまりなので利用例のプログラムを書いておきます。

動作検証は Windows 10 で行っています。JapanesePhoneticAnalyzer クラスは Windows 8.1(のWindows ストアアプリ)から利用できますが、この方法で作ったプログラムが Windows 8.1 のデスクトップ上で動くかどうかは検証できていません(手近なパソコンに Windows 8.1 の動いているものがないため)。

例示するプログラムは、テキストボックスへ文章を入力すると、変換の確定時に読み仮名用のテキストボックスに読み仮名が表示されるというものにしています。

例示のウィンドウ
例示のウィンドウ

まずは WPF のプロジェクトを作成します(プロジェクト名は YomiganaByUwpGetWords としています)。

最初に NuGet からUwpDesktop と MakViewModelBase のパッケージをプロジェクトにインストールします(MakViewModelBase は ViewModel を使うため)。

UwpDesktop パッケージをインストールすると、デスクトップ プログラムから UWP な API を利用するのに必要な DLL 等への参照設定がすべて行われるので非常に便利です。

次に MainViewModel クラスを作成します。プロジェクトに ViewModels フォルダを追加し、ViewModels フォルダに MainViewModel クラスを作成します。

using System.Linq;

using MakCraft.ViewModels;

namespace YomiganaByUwpGetWords.ViewModels
{
    class MainViewModel : ViewModelBase
    {
        private string _inputText;
        /// <summary>
        /// ユーザー入力を取得・設定します。
        /// </summary>
        public string InputText
        {
            get { return _inputText; }
            set
            {
                var results = Windows.Globalization.JapanesePhoneticAnalyzer.GetWords(value);
                Yomigana = string.Join(string.Empty, results.Select(s => s.YomiText));
                _inputText = value;
                base.RaisePropertyChanged();
            }
        }

        private string _yomigana;
        /// <summary>
        /// 読み仮名を取得・設定します。
        /// </summary>
        public string Yomigana {
            get { return _yomigana; }
            set
            {
                _yomigana = value;
                base.RaisePropertyChanged();
            }
        }
    }
}

GetWords メソッドは IReadOnlyList<JapanesePhoneme> を返して来るので、string.join メソッドで「空白の区切り文字でコレクションメンバーを連結」して Yomigana プロパティへセットしています。

最後に MainWindow です。

<Window x:Class="YomiganaByUwpGetWords.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:YomiganaByUwpGetWords"
        xmlns:vm="clr-namespace:YomiganaByUwpGetWords.ViewModels"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Window.DataContext>
        <vm:MainViewModel />
    </Window.DataContext>

    <StackPanel>
        <TextBlock
            Margin="6" HorizontalAlignment="Center"
            Text="UWP 用の API で読み仮名を取得" FontSize="20" />

        <Grid HorizontalAlignment="Center" Margin="10">
            <Grid.RowDefinitions>
                <RowDefinition Height="auto" />
                <RowDefinition Height="auto" />
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="auto" />
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>

            <TextBlock
                Margin="6" Text="入力:" />
            <TextBox
                Grid.Column="1" MinWidth="200" VerticalContentAlignment="Center"
                Text="{Binding InputText, UpdateSourceTrigger=PropertyChanged}" />
            <TextBlock
                Grid.Row="1" Margin="6" Text="読み仮名:" />
            <TextBox
                Grid.Row="1" Grid.Column="1"
                MinWidth="200" VerticalContentAlignment="Center"
                Text="{Binding Yomigana}" />
        </Grid>
    </StackPanel>
</Window>

入力のテキストボックスのバインディング設定で UpdateSourceTrigger を PropertyChanged にして、変換操作の確定で読み仮名が表示されるようにしています。


1 thought on “WPF で読みがなを取得(3)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です