Windows Phoneアプリケーション開発入門

第5回 Windows phoneでテキストエディタを作ろう!(3)

この記事を読むのに必要な時間:およそ 4 分

ソフトウェアキーボードを表示させた時の対応

Windows Mobile 6.5 Professionalエディションが搭載されたWindows phoneでは,ハードキーボードを搭載しない端末が増えています。その手の端末では,文字の入力をするためにソフトキーボード(SIP:Soft Input Panel)を使用します。

ソフトキーボードを有効にすると,ソフトキーボード部分が最前面に表示されます。アプリが隠れてしまい,場合によっては文字を入力しようとしている部分を隠してしまうことになります。

カーソルがソフトキーボードで隠れてしまう

カーソルがソフトキーボードで隠れてしまう

少し使い勝手が悪いですね。InputPanelコンポーネントを利用して改善しましょう。最終形としては,ソフトキーボードが表示されると,textEditの終端をソフトキーボードの上に移動させて被って表示されないようにします。

InputPanelは,マネージドコードからソフトキーボードの制御を行うことができるコンポーネントです。ツールボックスにありますので,フォームデザイナにてフォームにドラッグアンドドロップしてください。

InputPanelコンポーネントの追加

InputPanelコンポーネントの追加

追加したInputPanelをダブルクリックすると,EnabledChangedイベントのイベントハンドラがソースコードに追加されます。このEnabledChangedイベントは,ソフトキーボードが有効か無効に状態が変更されると通知されます。

private void inputPanel1_EnabledChanged(object sender, EventArgs e)
{
  if (inputPanel1.Enabled)
  {
    // ソフトキーボードが表示されている
  }
  else
  {
    // ソフトキーボードが表示されていない
  }
}

次に,ソフトキーボードの表示状態の変化に応じて,textEditの高さを変更します。

「Windows phoneでテキストエディタを作ろう!」1回目で,テキストボックスのDcokプロパティにはDockStyle.Fillを設定しました。Dockプロパティを設定すると,親コントロール(今回の場合はフォーム)のサイズ変更に合わせて,適切な配置でテキストのサイズを自動で変更します。

ソフトキーボードが非表示の場合は,今までどおりDockStyle.Fillを設定して,textEditをフォームの全部の端に合わせています。表示される場合は,DockプロパティにDockStyle.Topを設定して,フォームの上辺に揃えて配置した上で変更後の高さを設定します。

private void inputPanel1_EnabledChanged(object sender, EventArgs e)
{
  // 現在のテキストボックスの高さを取得
  int newHeight = textEdit.Height;

  if (inputPanel1.Enabled)
  {
    // ソフトキーボードが表示されている

    // テキストボックスの高さを設定するために
    // Dockプロパティを上辺にのみ揃える
    textEdit.Dock = DockStyle.Top;

    // ソフトキーボードの高さを考慮して,
    // 残った部分をテキストボックスの高さとする
    newHeight = newHeight - inputPanel1.Bounds.Height;
  }
  else
  {
    // ソフトキーボードが表示されていない

    // ソフトキーボードのことは考慮する必要がないので
    // フォームのすべての辺とドッキングさせる。
    textEdit.Dock = DockStyle.Fill;
  }

  // テキストボックスの高さを更新する
  textEdit.Height = newHeight;
}

ソフトキーボードの有効・無効の切り替え時に,テキストボックスのDockプロパティと高さを変更しました。これでソフトウェアキーボードとテキストボックスが干渉しなくなりました。

テキストボックスの高さ変更後

テキストボックスの高さ変更後

まとめ

開発するアプリケーションがテキストエディタだったので,テキストの書き込みと読み込みを行いました。デスクトップ版の.NET Frameworkで開発経験のある方には,⁠保存」⁠開く」の実装は特に問題ないと思います。

一方,InputPanelを使ってソフトキーボードとテキストボックスが重ならないようにする対応は,モバイル端末であるWindows phone独特の対応です。デスクトップと比較するとどうしてもソフトキーボードが占める領域が大きいので,開発者が干渉しないようにコントロールの配置を考慮する必要がありました。

以上で今回は終わりです。ありがとうございました。

著者プロフィール

和田健司(わだけんじ)

1982年10月12日生まれ。大阪で働くプログラマ。Microsoft MVP for Device Application Development(Jul 2010 - Jun 2011)。Windows Mobileに傾倒し今に至る。Windows Mobile向けのTipsを書いています。iPhoneアプリ開発を始めました。嫌いな食べ物はカレー。

URL: http://ch3cooh.jp/
Blog: http://d.hatena.ne.jp/ch3cooh393/