locked
DataGridに配置したTextBoxのIME制御 RRS feed

  • 質問

  • DataGridの編集用セルに配置したTextBoxに、VB側でIME設定をした場合初回フォーカス時のみIMEが切り替わらない現象を確認しています。

    初回フォーカス後、別の行のTextBoxにフォーカスをあてると、以降は設定した通りIMEが切り替わります。

    初回フォーカス時にもIMEが切り替わるような回避策がありませんでしょうか。アドバイスお願いいたします。

    以下に、動作確認したソースコードの抜粋を示します。

    (XAML側抜粋)
     -----------------------------------------------------------------
      <data:DataGrid x:Name="dgdS233CopySource" AutoGenerateColumns="False">
        <data:DataGrid.Columns>
          <!--商品分類-->
          <data:DataGridTemplateColumn Header="商品分類" Width="144">
            <data:DataGridTemplateColumn.CellTemplate>
              <DataTemplate>
                <TextBlock x:Name="txbS233MHgName" Text="{Binding DeptName}"/>
              </DataTemplate>
            </data:DataGridTemplateColumn.CellTemplate>
            <data:DataGridTemplateColumn.CellEditingTemplate>
              <DataTemplate>
                <TextBox x:Name="tbxS233MHgName" Text="{Binding DeptName, Mode=TwoWay}" />
              </DataTemplate>
            </data:DataGridTemplateColumn.CellEditingTemplate>
          </data:DataGridTemplateColumn>
          :
        </data:DataGrid.Columns>
      </data:DataGrid>
     -----------------------------------------------------------------

    (VB側抜粋)
     -----------------------------------------------------------------
      'DataGrid.PreparingCellForEditイベントハンドラにてIME設定
      Private Sub Preparing_CellForEdit(sender As Object, e As DataGridPreparingCellForEditEventArgs)
        Dim element As FrameworkElement = e.EditingElement

        '編集モード時、DataGrid内TextBoxを全角カナモードに変更
        InputMethod.SetIsInputMethodEnabled(element, True)
        InputMethod.SetPreferredImeState(element, InputMethodState.On)
        InputMethod.SetPreferredImeConversionMode(element,
                             ImeConversionModeValues.FullShape _
                             Or ImeConversionModeValues.Katakana _
                             Or ImeConversionModeValues.Native)

      End Sub

     -----------------------------------------------------------------

    2012年6月21日 11:37

すべての返信

  • 通常、IMEをONにしたい場合は

    <sdk:DataGridTemplateColumn.CellEditingTemplate >
        <DataTemplate>
            <TextBox Text="{Binding DeptName, Mode=TwoWay}" 
                     InputMethod.IsInputMethodEnabled="True" 
                     InputMethod.PreferredImeState="On"/>
        </DataTemplate>
    </sdk:DataGridTemplateColumn.CellEditingTemplate>
    

    の様に書きます。
    この様に書くと、初回からきちんとIMEがONになります。

    上記の様に書かずに、DataGrid.PreparingCellForEditイベントを使用しなければならない理由があるのでしょうか?


    ☆TFC Software http://www.tfc-software.com/
    ☆プログラミングに関するブログ http://www.tfc-software.com/Blogs.aspx

    2012年6月21日 13:22
  • 返信ありがとうございます。

    仰る通り、XAMLに直接書けば初回フォーカス時でもIMEが切り替わることを確認しております。

    今回の場合、TextBoxのプロパティは外部ファイルで設定し、TextBoxの利用目的によってプロパティをいっぺんに設定する必要があるため、XAML定義ではなく、TextBoxのインスタンスが生成されるタイミングで属性の設定をする必要があります。(アプリケーション開発後も、外部ファイルによってプロパティ変更をする場合もあります。)

    (例:画面1~画面n で用いられるTextBoxのうち、"商品分類"用のTextBoxであれば、外部ファイルに設定してある商品分類専用のプロパティ設定を行う)

    なので実際にはOnApplyTemplate のタイミングでIME設定をしているのですが、今回は実験のためDataGrid.PreparingCellForEditを用いています。

    2012年6月22日 2:00
  • こんにちは、投稿させていただきます。

    スマートではないですが、datagridのloadedのタイミングコード上からですべてのTextboxにフォーカスを移動させてみてはどうでしょうか?

    思いつきである上、試していないので、回避策になるかどうかはわかりませんが。

    参考になれば。

    2012年8月5日 9:31