FlexGrid for WPF
IMEモードを切り替える
基本操作 > 編集機能 > IMEモードを切り替える

C1FlexGrid コントロールにおいてIME制御を行うには、InputMethod クラスを使用してIMEの状態を取得や設定します。また、グリッドでセル編集時のIME 変換モードを切りかえる方法として、InputMethod を使用します。

たとえば、次のコードでは、列ごとに編集時のIMEの変換モードを切り替える方法を示します。最初の列はXAML上でIMEを制御する方法(編集用のTextBoxに対してIME制御関連の設定を行う)を示します。2 列目以降は、コード上でIMEを制御する方法を示します。それに加えて、セルが選択された時点で強制的に編集モードに切り替える方法も示します。

【実行例】

マークアップ
コードのコピー
<c1:C1FlexGrid x:Name="c1FlexGrid1" AutoGenerateColumns="False" ItemsSource="{Binding}" Margin="0" >
    <c1:C1FlexGrid.Columns>
        <c1:Column Header="半角カタカナ">
            <c1:Column.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Column0, Mode=OneWay}" />
                </DataTemplate>
            </c1:Column.CellTemplate>
            <c1:Column.CellEditingTemplate>
                <DataTemplate>
                    <TextBox Text="{Binding Column0, Mode=TwoWay}" InputMethod.PreferredImeState="On" InputMethod.PreferredImeConversionMode="Native" />
                </DataTemplate>
            </c1:Column.CellEditingTemplate>
        </c1:Column>
        <c1:Column x:Name="column2" Header="全角カタカナ" Binding="{Binding Column1}" />
        <c1:Column x:Name="column3" Header="ひらがな" Binding="{Binding Column2}" />
        <c1:Column x:Name="column4" Header="IME オフ" Binding="{Binding Column3}" />
    </c1:C1FlexGrid.Columns>
</c1:C1FlexGrid>
コードのコピー
Public Partial Class MainWindow
    Inherits Window
    Public Sub New()
        InitializeComponent()
        Me.DataContext = SampleData.GetSampleData()
        AddHandler Me.c1FlexGrid1.SelectionChanged, AddressOf c1FlexGrid1_SelectionChanged
        AddHandler Me.c1FlexGrid1.BeginningEdit, AddressOf c1FlexGrid1_BeginningEdit
        AddHandler Me.c1FlexGrid1.CellEditEnded, AddressOf c1FlexGrid1_CellEditEnded
    End Sub
    Private Sub c1FlexGrid1_BeginningEdit(sender As Object, e As CellEditEventArgs)
        ' 条件に基づいて、TextBoxの IME 変換モードを切り替えます。
        Select Case e.Column
            Case 1
                ' 全角カタカナ
                InputMethod.Current.ImeState = InputMethodState.[On]
                InputMethod.Current.ImeConversionMode = ImeConversionModeValues.Katakana Or ImeConversionModeValues.FullShape
                Exit Select
            Case 2
                ' ひらがな
                InputMethod.Current.ImeState = InputMethodState.[On]
                InputMethod.Current.ImeConversionMode = ImeConversionModeValues.Native Or ImeConversionModeValues.FullShape
                Exit Select
            Case 3
                ' IME オフ
                InputMethod.Current.ImeState = InputMethodState.Off
                Exit Select
        End Select
    End Sub
    Private Sub c1FlexGrid1_CellEditEnded(sender As Object, e As CellEditEventArgs)
        InputMethod.Current.ImeState = InputMethodState.Off
    End Sub
    Private Sub c1FlexGrid1_SelectionChanged(sender As Object, e As CellRangeEventArgs)
        ' 必要に応じて、セルを編集状態にします。
        ' これは、非編集状態でセル内に IME 入力を行おうとすると、セルに対するインライン入力が行われないという制限に対する対処法となります。
        Me.c1FlexGrid1.StartEditing(False)
    End Sub
End Class
コードのコピー
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = SampleData.GetSampleData();

        this.c1FlexGrid1.SelectionChanged += c1FlexGrid1_SelectionChanged;
        this.c1FlexGrid1.BeginningEdit += c1FlexGrid1_BeginningEdit;
        this.c1FlexGrid1.CellEditEnded += c1FlexGrid1_CellEditEnded;
    }
    private void c1FlexGrid1_BeginningEdit(object sender, CellEditEventArgs e)
    {
        // 条件に基づいて、TextBoxの IME 変換モードを切り替えます。
        switch (e.Column)
        {
            case 1: // 全角カタカナ
                InputMethod.Current.ImeState = InputMethodState.On;
                InputMethod.Current.ImeConversionMode = ImeConversionModeValues.Katakana | ImeConversionModeValues.FullShape;
                break;
            case 2: // ひらがな
                InputMethod.Current.ImeState = InputMethodState.On;
                InputMethod.Current.ImeConversionMode = ImeConversionModeValues.Native | ImeConversionModeValues.FullShape;
                break;
            case 3: // IME オフ
                InputMethod.Current.ImeState = InputMethodState.Off;
                break;
        }
    }
    private void c1FlexGrid1_CellEditEnded(object sender, CellEditEventArgs e)
    {
        InputMethod.Current.ImeState = InputMethodState.Off;
    }

    private void c1FlexGrid1_SelectionChanged(object sender, CellRangeEventArgs e)
    {
        // 必要に応じて、セルを編集状態にします。
        // これは、非編集状態でセル内に IME 入力を行おうとすると、セルに対するインライン入力が行われないという制限に対する対処法となります。
        this.c1FlexGrid1.StartEditing(false);
    }
}