IME 管理コンポーネントは、テキストコントロールや標準のテキストボックス等のコントロールに、日本語 IME による入力プロセス中に使用可能な読み取り文字列の取得、IME 状態の取得や保持といった機能を提供する拡張コンポーネントです。
IME 管理コンポーネントには ReadingString、ReadingStringKanaMode、ReadingStringOutputMode の 3 つの添付プロパティがあり、これによってターゲット要素上の読み取り文字列を管理します。
WPF のデータバインディング機能と IME 管理コンポーネントを組み合わせることで、コントロールに入力された変換文字列に対する読み取り文字列を、指定したコントロールへ自動的に表示することができます。
入力された読み取り文字列は、ReadingString 添付プロパティにて取得します。Binding オブジェクトの Path プロパティに ReadingString 添付プロパティを設定することで、漢字の入力が行われるたびに指定したコントロールにて読み取り文字列が表示されるようになります。
取得される読み取り文字列のかなモードは、ReadingStringKanaMode 添付プロパティを使用して指定します。ReadingStringKanaMode 添付プロパティには、以下の3つの設定値があります。
プロパティ値 |
説明 |
KanaMode.KatakanaHalf |
日本語の文字を半角カタカナに変換します。 |
KanaMode.Katakana |
日本語の文字を全角カタカナに変換します。 |
KanaMode.Hiragana |
日本語の文字をひらがなに変換します。 |
また、ReadingStringOutputMode 添付プロパティを使用して、読み取り文字列の出力形式を指定します。ReadingStringOutputMode 添付プロパティには、以下の3つの設定値があります。
プロパティ値 |
説明 |
ReadingStringOutputMode.None |
ReadingString 添付プロパティに読み取り文字列を反映させません。 |
ReadingStringOutputMode.Append |
ReadingString 添付プロパティの内容の末尾に読み取り文字列を追加します。 |
ReadingStringOutputMode.Replace |
ReadingString 添付プロパティの内容を新たな読み取り文字列で上書きします。 |
以下のサンプルコードは、氏名フィールドに入力された氏名に対するふりがなを半角カタカナで表示する XAML コードです。
<StackPanel>
<im:GcTextBox WatermarkDisplayNull="ここにふりがなが表示されます" WatermarkDisplayNullForeground="LightSteelBlue">
<im:GcTextBox.Text>
<Binding Mode="TwoWay" ElementName="GcTextBox1" Path="(im:GcImeManager.ReadingString)" />
</im:GcTextBox.Text>
</im:GcTextBox>
<im:GcTextBox Name="GcTextBox1" im:GcImeManager.ReadingStringKanaMode="KatakanaHalf" im:GcImeManager.ReadingStringOutputMode="Append"
WatermarkDisplayNull="氏名を入力してください。" WatermarkDisplayNullForeground="LightSteelBlue" />
</StackPanel>
AllowSaveImeStatus 添付プロパティを true に設定することで、指定した要素の IME 状態を保存することができます。このとき、実際には以下の処理が行われます。
- 日本語 IME バーの状態の変更を監視し、状態が変更された場合に現在の IME バーの状態をターゲット要素に適用します。
- 要素がフォーカスを取得したときに日本語 IME バーの現在の状態をバックアップし、前回フォーカスを取得していた時点での IME 状態を再びその要素に適用します。
- その要素がフォーカスを失ったときに、上記で保存していたバックアップの内容を復元します。
以下のサンプルコードは、AllowSaveImeStatus 添付プロパティの動作を確認するための例です。
<StackPanel>
<StackPanel Orientation="Horizontal">
<TextBox />
<TextBlock Text="1. IME に関する設定はなにも行っていません。" />
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBox im:GcImeManager.AllowSaveImeStatus="True" />
<TextBlock Text="2. AllowSaveImeStatus を true に設定しています。" />
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBox InputMethod.PreferredImeState="On" InputMethod.PreferredImeConversionMode="FullShape,Native" />
<TextBlock Text="3. IME の状態を「ひらがな」に設定しています。" />
</StackPanel>
</StackPanel>
上記サンプルを実行したら、以下のそれぞれの操作を行うことで、AllowSaveImeStatus 添付プロパティの設定が IME の状態変化にどのように影響するか確認できます。
- はじめに、1番目の TextBox にフォーカスを移動し、IME が OFF であることを確認します。このとき IME が ON となっている場合は OFF に切り替えてください。
- 次に、2番目の TextBox にフォーカスを移動し、IME を ON に切り替え、再び1番目の TextBox へフォーカスを移動します。このとき、1番目の TextBox では、IME が OFF に戻っていることに注目してください。また、1番目と2番目の TextBox 間で複数回フォーカスを移動し、2番目の TextBox のみ IME が ON になることを確認してください。
- 前述の手順と同様に、3番目の TextBox にフォーカスを移動し、再び1番目の TextBox へフォーカスを移動します。このとき、1番目の TextBox では、3番目の TextBox で設定された IME の状態がそのまま引き継がれていることに注目してください。
- 1番目の TextBox へフォーカスを移動し、IME を OFF にします。次に、2番目の TextBox へフォーカスを移動し、IME を ON に、入力モードを「カタカナ」に変更します。この状態で2→1→2、あるいは2→3→2とフォーカスを移動し、それぞれの TextBox 上で IME の状態がどのように変化するか確認してください。
GetConversionList メソッドを使用して、指定された読み取り文字列に対する変換候補のリストを取得できます。また、GetReverseConversionList メソッドを使用して、指定された変換結果文字列に対する読み取り文字列のリストを取得できます。取得されるリストの内容は、IME の種類や IME の学習状態などにより異なります。
以下のサンプルコードは、入力された読み取り文字列に対する変換候補文字列の一覧を ListBox に表示します。
Imports GrapeCity.Windows.InputMan
Private Sub GcTextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.Windows.Controls.TextChangedEventArgs)
ListBox1.ItemsSource = GcImeManager.GetConversionList(GcTextBox1.Text)
End Sub
using GrapeCity.Windows.InputMan;
private void GcTextBox1_TextChanged(object sender, TextChangedEventArgs e)
{
ListBox1.ItemsSource = GcImeManager.GetConversionList(GcTextBox1.Text);
}
<!-- VB、C#とも、以下のコードをページ内に記述してください -->
<StackPanel>
<im:GcTextBox Name="GcTextBox1" Format="J" TextChanged="GcTextBox1_TextChanged" />
<ListBox x:Name="ListBox1" />
</StackPanel>
ImeConversionMode、ImeSentenceMode、および ImeState の各プロパティを使用して、現在の IME の状態を取得することができます。これらは、InputMethod クラスの同名のプロパティと同じ値を返しますが、InputMethod と異なり、GcImeManager のそれらのプロパティは依存関係プロパティであり、Trigger や Binding をサポートします。これにより、IME 状態をトリガーの条件として使用することができます。
以下のサンプルコードは、GcTextBox コントロールがフォーカスを受け取り、かつ IME が ON の場合に、背景色を変更する XAML コードです。
<StackPanel Margin="10">
<StackPanel.Resources>
<Style TargetType="im:GcTextBox">
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding Source={x:Static im:GcImeManager.Current}, Path=ImeState}" Value="On"/>
<Condition Binding="{Binding RelativeSource={RelativeSource Mode=Self}, Path=IsKeyboardFocusWithin}" Value="True"/>
</MultiDataTrigger.Conditions>
<Setter Property="Background" Value="LightGreen"/>
</MultiDataTrigger>
</Style.Triggers>
</Style>
</StackPanel.Resources>
<TextBlock Text="フォーカスを受け取ったときに IME が OFF になるようにしています。" />
<im:GcTextBox InputMethod.PreferredImeState="Off"/>
<TextBlock Text="フォーカスを受け取ったときに IME が ON になるようにしています。" Margin="0, 10, 0, 0" />
<im:GcTextBox InputMethod.PreferredImeState="On"/>
</StackPanel>