SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

現役エンジニア直伝! 「現場」で使えるコンポーネント活用術(InputMan)

日本仕様の入力フォームを持ったSilverlightアプリケーションを作成しよう~InputMan for SliverlightでWebアプリを強化する

  • このエントリーをはてなブックマークに追加

ダウンロード サンプルソース (1.0 MB)

 SilverlightはWebだけでなくOut Of Brower(OOB)によるローカル実行、Windows Phone 7上での実行などマイクロソフトのクロスプラットフォーム戦略の中核を担っている技術です。そんなSilverlightの適用範囲をさらに広げる可能性を秘めたコンポーネントが、今回紹介するInputMan for Silverlight 1.0Jです。Silverlightの日本語入力周りがInputManにより強化されることで本格的に日本の業務アプリもSilverlightにシフトし始めるかも知れません。

  • このエントリーをはてなブックマークに追加

Silverlightの適用範囲をさらに広げるコンポーネント

 SilverlightはWebだけでなくOut Of Brower(OOB)によるローカル実行、Windows Phone 7上での実行などマイクロソフトのクロスプラットフォーム戦略の中核を担っている技術です。

 そんなSilverlightの適用範囲をさらに広げる可能性を秘めたコンポーネントが、今回紹介するInputMan for Silverlight 1.0Jです。グレープシティの人気コンポーネントであるInputManが、Silverlight上で使えるというだけでワクワクした気持ちになってくるのですが、比較的弱いといわれているSilverlightの日本語入力周りがInputManにより強化されることで、本格的に日本の業務アプリもSilverlightにシフトし始めるかもしれません。

表1 InputMan for Silverlight 1.0Jに収録されているコンポーネント
コントロール名 コンポーネント名 説明
テキスト GcTextBox 入力文字種制限が可能なテキスト入力コントロール
マスク GcMask 郵便番号などの特定書式指定が可能な入力コントロール
日付 GcDateTime 日付と時刻の入力に特化した入力コントロール
数値 GcNumber 数値入力を細かく制御できる入力コントロール
カレンダー GcDropDownCalendar スタイルを自由にカスタマイズできる入力コントロール
電卓 GcDropDownCalculator 四則演算とメモリ機能を備えた電卓入力コントロール
検証インジケータ GcValidationIndicator 入力値の検証違反を通知するコントロール
ふりがな取得 GcImeManager ふりがな取得機能を備えたコンポーネント

InputMan for Silverlightを使うための前準備

 InputMan for Silvelightを動作させるための開発環境構成は、「Visual Studio 2010日本語版」+「Silverlight 4 Tools for Visual Studio」という組み合わせになります。Silverlight 4 Tools for Visual StudioはMicorsoftのダウンロードセンターからダウンロードできます。

 運用時のブラウザ環境としては、Internet Explorer 6/7/8、およびFirefox 3.0/3.5/3.6が推奨されています。手元に環境がなく確認はとれていないため推測の域をでませんが、ブラウザのレンダリングに左右されるHTMLベースのWebアプリケーションではなくSilverlight 4のランタイムの中で稼働するので、Silverlight 4が動作する環境であれば他のブラウザ環境でも稼働できる可能性があります。

新規プロジェクトの作成

 [ファイル]-[新規作成]-[プロジェクト]メニューをクリックし、「新しいプロジェクト」ダイアログから「Silverlight」テンプレート内にある[Silverlightアプリケーション]テンプレートを選択します。

図1 新規プロジェクトの作成
図1 新規プロジェクトの作成

 SilverlightはASP.NET Webアプリ、ASP.NET Webサイト、ASP.NET MVCの3種類すべてに対応しているので、Silverlight以外の部分をどのような構成で作成するのかを考えて種類を選びます。今回は[Webサイト]で作成してみたいと思います。

図2 Webプロジェクトの種類
図2 Webプロジェクトの種類

 作成されるソリューションは、Silverlightプロジェクト(サンプルでは「CZ1012InputMan」プロジェクト)とSilverlightを動作させるためのテスト用ASP.NET Webサイトプロジェクト(サンプルでは「CZ1012InputMan.Web」)から構成されています。

図3 ソリューションの構成
図3 ソリューションの構成

ツールボックスへの登録

 InputMan for SilverlightをWebフォームに配置するには、ツールボックスからコントロールのアイコンをドラッグ&ドロップします。そのためには、ツールボックスにInput Man for Silverlightコンポーネントを追加しなければなりません。

 ツールボックスウィンドウで右クリックして[アイテムの選択]メニューを選び、ダイアログでコンポーネントを選択します。

図4 ツールボックスへの登録
図4 ツールボックスへの登録

 以上で準備は完了です。

サンプルアプリの画面デザイン

 今回のサンプルは、イベントへの参加登録画面をイメージして作成しました。

図5 サンプル画面デザイン
図5 サンプル画面デザイン

 この画面デザインはVisual Studio上でもデザイナー(「デザイン」タブ)、またはエディタ(「XAML」タブ)を使ってデザインできますが、Expression Blendがインストールしてあれば、ソリューションエクスプローラーで「MainPage.xaml」ファイルを右クリックして[Expression Blendを開く]メニューからExpression Blendを起動し、編集することもできます。Expression Blendを使えば、Story Boardなどが設定しやすく便利です。

図6 Expression Blend画面
図6 Expression Blend画面

 このサンプル画面には、次のInputMan for Silverlightのコントロールおよびコンポーネントを使用しています。

  • GcTextBox
  • GcMask
  • GcDateTime
  • GcValidationIndicator
  • GcImeManager

 それでは、まず各コントロールを配置する前のXAMLの内容をみてみましょう。

リスト1 ベースとなるXAML定義
<UserControl x:Class="CZ1012InputMan.MainPage"
    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"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400" 
    xmlns:im="http://schemas.grapecity.com/windows/2010/inputman" 
    xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk">
    <Canvas>
        <Canvas.Background>
            <ImageBrush ImageSource="/CZ1012InputMan;component/Images/ItaIDE003.png" 
                       Stretch="Uniform"  Opacity="0.3"
                       AlignmentX="Right" AlignmentY="Top" />
        </Canvas.Background>
        <Grid x:Name="LayoutRoot" Margin="10" Loaded="MainPanel_Loaded">
            <Grid.RowDefinitions>
                <RowDefinition Height="40"/>
                <RowDefinition Height="40"/>
                <RowDefinition Height="40"/>
                <RowDefinition Height="40"/>
                <RowDefinition Height="40"/>
                <RowDefinition Height="80*"/>
                <RowDefinition Height="40"/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="75" />
                <ColumnDefinition Width="290"/>
                <ColumnDefinition Width="25" />
            </Grid.ColumnDefinitions>
        </Grid>
    </Canvas>
</UserControl>

 今回のサンプルでは表示画面に背景画像を表示したかったので、Canvasの中に背景用のCanvasとデータ表示用のGridを配置しています。

 Grid部分は7行3列になるようにRowとColumnを設定しています。6行目は『コメント欄』で、入力に応じて高さを可変にしたいので「<RowDefinition Height="80*"/>」のように、アスタリスク付きで指定しています。

GridコントロールのLoadedイベント

 Gridコントロールのイベントとして「Loaded="MainPanel_Loaded"」を定義しています。「MainPage.xaml.vb」には、対応する次のイベントプロシージャが記述されています。XAML側でイベントとイベントプロシージャの関連付けが行われているので「MainPage.xaml.vb」側にはHandle句がないことに注意してください。

リスト2 Loadedイベントのイベントプロシージャ例
Private Local As CZ1012Class

Private Sub MainPanel_Loaded(ByVal sender As System.Object,
                             ByVal e As System.Windows.RoutedEventArgs)
    Local = New CZ1012Class() With {.Name = "藍澤 光",
                                    .Kana = "アイザワ ヒカル",
                                    .BirthDay = CDate("1996/09/27")}
    Me.LayoutRoot.DataContext = Local
    Me.current = GrapeCity.Windows.InputMan.GcImeManager.Current
End Sub

 イベントプロシージャの中では、データ定義である「CZ1012Class」のオブジェクトを初期値を代入しながら生成して、そのオブジェクトをGridコントロール(Me.LayoutRoot)のDataContextに割り当てています。

 ここで使っている「CZ1012Class」は、次のようなコードになっています。

リスト3 データストアクラスの例
Public Class CZ1012Class
    Public Property Name As String
    Public Property Kana As String
    Public Property HandleName As String
    Public Property MailAddress() As String
    Public Property BirthDay As Date
    Public Property Comment As String
End Class

『本名欄』の構成

 『本名欄』部分のXAMLファイルは次のようになります。この定義は先ほどの【リスト1】の「</Grid.ColumnDefinitions>」と「</Grid>」の間に記述します。

リスト4 『本名欄』のXAML定義
<sdk:Label Grid.Row="0" Grid.Column="0" Content="本名:" 
           VerticalContentAlignment="Center" />
<im:GcTextBox Grid.Row="0" Grid.Column="1" Name="Name_TextBox" 
              WatermarkDisplayNull="必須項目" 
              WatermarkDisplayNullForeground="#80000000" 
              WatermarkNull="本名を入力してください。" 
              WatermarkNullForeground="#80000000" 
              Format="aAZ" MaxLength="16" HighlightText="True"
              VerticalContentAlignment="Stretch" VerticalAlignment="Center"
              im:GcImeManager.ReadingStringKanaMode="KatakanaHalf" 
              im:GcImeManager.ReadingStringOutputMode="Replace"
              >
    <im:GcTextBox.Effect>
        <DropShadowEffect/>
    </im:GcTextBox.Effect>
    <im:GcTextBox.Text>
        <Binding Path="Name" Mode="TwoWay"/>
    </im:GcTextBox.Text>
</im:GcTextBox>
<im:GcValidationIndicator Grid.Row="0" Grid.Column="2" 
                          Height="16" Margin="0,12,0,0" Width="16" 
                          Name="Name_ValidationIndicator" 
                          ElementName="Name_TextBox" />

タイトル

 「Grid.Row="0" Grid.Column="0"」には、「本名:」というタイトルをラベル表示します。ラベルをプログラム側から変更しないのでNameプロパティは定義していません。Windowsフォームと、WPFやSilverlightが最も異なるのはコントロールに名前が必須ではない点です。そのため、必要最小限の名前を考えれば良いわけです。

入力欄コード解説

  1. Grid.Row="0" Grid.Column="1"」には「Name_TextBox」という名前でGcTextBoxコントロールを配置しています。
  2. WatermarkDisplayNullプロパティで、入力欄に値が設定されていないときの表示を指定しています。コントロールがフォーカスを得た時に入力欄に値が設定されていない場合は、WatermarkNullプロパティの内容が表示されます。それぞれ少し薄い色で表示する事で、実際の入力値と区別がつくようにしています。
  3. Format="aAZ"」としているので英小文字、英大文字、空白、全角文字すべてが入力できるように設定しています。また、MaxLengthプロパティに「16」と指定して、最大文字数を16文字に制限しています。
  4. GcImeManagerを指定してIMEの入力をGcImeManagerに送信しています。
  5. GcTextBox.Effectを指定して影付きの入力欄にします。
  6. <Binding Path="Name" Mode="TwoWay"/>」をTextプロパティに指定して、GridのDataContextに割り当てたクラスのNameプロパティ値と連携します。
Formatプロパティの設定を助ける書式の設定ダイアログ

 Formatプロパティに設定にはさまざまな書式があるので、覚えたりヘルプファイルで毎回調べるのも非効率的です。そこで活躍するのが「書式の設定ダイアログ」です。

図7 書式の設定ダイアログ
図7 書式の設定ダイアログ

 代表的な書式は最初から登録されており、それ以外についてもカスタム入力欄の右側のボタンをクリックすれば、書式を一覧から選択して組み立てることができます。

『フリガナ欄』の構成

 『フリガナ欄』部分のXAMLファイルは次のようになります。

リスト5 『フリガナ欄』のXAML定義
<im:GcTextBox Grid.Row="1" Grid.Column="1" Name="Kana_TextBox" 
              WatermarkDisplayNull="必須項目" 
              WatermarkDisplayNullForeground="#80000000" 
              WatermarkNull="フリガナを入力してください。" 
              WatermarkNullForeground="#80000000" 
              VerticalContentAlignment="Stretch" VerticalAlignment="Center" 
              Format="K" MaxLength="32" HighlightText="True" 
              HorizontalAlignment="Left" Margin="0,8" Width="290">
    <im:GcTextBox.Effect>
        <DropShadowEffect/>
    </im:GcTextBox.Effect>
    <im:GcTextBox.Text>
        <Binding Path="Kana" Mode="TwoWay"/>
    </im:GcTextBox.Text>
</im:GcTextBox>

入力欄コード解説

  1. Grid.Row="1" Grid.Column="1"」には、「Kana_TextBox」という名前でGcTextBoxコントロールを配置しています。
  2. WatermarkDisplayNullプロパティで、入力欄に値が設定されていないときの表示を指定しています。コントロールがフォーカスを得た時に入力欄に値が設定されていない場合は、WatermarkNullプロパティの内容が表示されます。それぞれ少し薄い色で表示する事で、実際の入力値と区別がつくようにしています。
  3. Format="K"」としているので半角カナのみが入力できます。また、デフォルトでAutoConvertがTrueになっているので、全角カナや全角ひらがなの入力は自動的に半角カナに変換されます。
  4. 「GcTextBox.Effect」を指定して影付きの入力欄にします。
  5. <Binding Path="Kana" Mode="TwoWay"/>」をTextプロパティに指定して、GridのDataContextに割り当てたクラスのKanaプロパティ値と連携します。

『メールアドレス欄』の構成

リスト6 『メールアドレス欄』のXAML定義
<im:GcMask Grid.Row="3" Grid.Column="1" Name="MailAddress_Mask" 
           WatermarkDisplayNull="必須項目" 
           WatermarkDisplayNullForeground="#80000000" 
           WatermarkNull="メールアドレスを入力してください。" 
           WatermarkNullForeground="#80000000" 
           VerticalContentAlignment="Stretch" VerticalAlignment="Center" 
           HighlightText="Field">
    <im:GcMask.FieldSet>
        <im:MaskFieldSet>
            <im:MaskPatternField Pattern="\H{1,}"/>
            <im:MaskLiteralField Text="@"/>
            <im:MaskPatternField Pattern="\W{1,}"/>
            <im:MaskLiteralField Text="."/>
            <im:MaskPatternField Pattern="\W{1,}"/>
        </im:MaskFieldSet>
    </im:GcMask.FieldSet>
    <im:GcMask.Effect>
        <DropShadowEffect/>
    </im:GcMask.Effect>
    <im:GcMask.Text>
        <Binding Path="MailAddress" Mode="TwoWay" />
    </im:GcMask.Text>
</im:GcMask>

入力欄コード解説

  1. Grid.Row="3" Grid.Column="1"」には「MailAddress_Mask」という名前でGcMaskコントロールを配置しています。
  2. WatermarkDisplayNullプロパティで、入力欄に値が設定されていないときの表示を指定しています。コントロールがフォーカスを得た時に入力欄に値が設定されていない場合は、WatermarkNullプロパティの内容が表示されます。それぞれ少し薄い色で表示する事で、実際の入力値と区別がつくようにしています。
  3. 「MaskFieldSet」として、『1文字以上の半角文字 + @ + 1文字以上の半角英数字 + . + 1文字以上の半角英数字』という形式のメールアドレスのみを入力できるように制限しています。
  4. 「GcTextBox.Effect」を指定して影付きの入力欄にします。
  5. <Binding Path=" MailAddress " Mode="TwoWay"/>」をTextプロパティに指定して、GridのDataContextに割り当てたクラスのMailAddressプロパティ値と連携します。

『生年月日欄』の構成

リスト7 『生年月日欄』のXAML定義
<im:GcDateTime Grid.Row="4" Grid.Column="1" 
               Name="Birth_Date" 
               WatermarkDisplayNull="任意項目" 
               WatermarkDisplayNullForeground="#80000000" 
               WatermarkNull="生年月日を入力してください。" 
               WatermarkNullForeground="#80000000" 
               VerticalContentAlignment="Stretch" VerticalAlignment="Center" 
               HighlightText="Field" >
    <im:GcDateTime.DisplayFieldSet>
        <im:DateDisplayFieldSet>
            <im:DateYearDisplayField />
            <im:DateLiteralDisplayField Text="/" />
            <im:DateMonthDisplayField />
            <im:DateLiteralDisplayField Text="/" />
            <im:DateDayDisplayField />
        </im:DateDisplayFieldSet>
    </im:GcDateTime.DisplayFieldSet>
    <im:GcDateTime.FieldSet>
        <im:DateFieldSet>
            <im:DateYearField />
            <im:DateLiteralField Text="/" />
            <im:DateMonthField />
            <im:DateLiteralField Text="/" />
            <im:DateDayField />
        </im:DateFieldSet>
    </im:GcDateTime.FieldSet>
    <im:GcDateTime.Effect>
        <DropShadowEffect/>
    </im:GcDateTime.Effect>
    <im:GcDateTime.Value>
        <Binding Path="BirthDay" Mode="TwoWay"/>
    </im:GcDateTime.Value>
</im:GcDateTime>

入力欄コード解説

  1. Grid.Row="4" Grid.Column="1"」には「Birth_Date」という名前でGcDateTimeコントロールを配置しています。
  2. WatermarkDisplayNullプロパティで入力欄に値が設定されていないときの表示を指定しています。コントロールがフォーカスを得た時に入力欄に値が設定されていない場合は、WatermarkNullプロパティの内容が表示されます。それぞれ少し薄い色で表示する事で、実際の入力値と区別がつくようにしています。
  3. 「GcTextBox.Effect」を指定して影付きの入力欄にします。
  4. <Binding Path=" BirthDay " Mode="TwoWay"/>」をTextプロパティに指定して、GridのDataContextに割り当てたクラスのBirthDayプロパティ値と連携します。

『コメント欄』の構成

 『コメント欄』は複数行が入力できるようになっています。また、各行は点線で区切られており見栄えの良い複数行入力欄を実現しています。

図8 複数行入力欄の例
図8 複数行入力欄の例
リスト8 『コメント欄』のXAML定義
<im:GcTextBox Grid.Row="5" Grid.Column="1" 
              Name="Comment_TextBox" 
              WatermarkDisplayNull="任意項目"
              WatermarkDisplayNullForeground="#80000000" 
              WatermarkNull="連絡事項を入力してください。" 
              WatermarkNullForeground="#80000000" 
              Multiline="True" MaxLength="2000" MaxLengthUnit="Byte" 
              GridLineStyle="Dotted" GridLineBrush="Black" 
              TextWrapping="Wrap" Margin="0,8,0,0" HighlightText="True">
    <im:GcTextBox.Effect>
        <DropShadowEffect/>
    </im:GcTextBox.Effect>
    <im:GcTextBox.Text>
        <Binding Path="Comment" Mode="TwoWay"/>
    </im:GcTextBox.Text>
</im:GcTextBox>

入力欄コード解説

  1. Grid.Row="5" Grid.Column="1"」にはComment_TextBoxという名前でGcTextBoxコントロールを配置しています。
  2. WatermarkDisplayNullプロパティで入力欄に値が設定されていないときの表示を指定しています。コントロールがフォーカスを得た時に入力欄に値が設定されていない場合は、WatermarkNullプロパティの内容が表示されます。それぞれ少し薄い色で表示する事で、実際の入力値と区別がつくようにしています。
  3. Multiline="True" MaxLength="2000" MaxLengthUnit="Byte"」として、複数行サポート、最大2000バイトまで入力可能にしています。
  4. 「GcTextBox.Effect」を指定して影付きの入力欄にしています。
  5. <Binding Path=" Comment " Mode="TwoWay"/>」をTextプロパティに指定して、GridのDataContextに割り当てたクラスのCommentプロパティ値と連携します。

コードによるふりがな連携

 『本名欄』に名前を入力すると『フリガナ欄』と自動的に連携し、半角カタカナでふりがなが記入される方法をヘルプで調べると、TextプロパティにBindingする例が掲載されています。しかし、今回のサンプルではデータの設定手段としてBindingを使ってしまっているので、ヘルプに記述されているサンプル方法では、ふりがな連携が実現できません。

 つまりこのような場合は、Bindingするのはデータなのか、ふりがななのかを決めなければなりません。ふりがなだけデータとBindingできないのも一貫性がないので、ふりがなはBindingではなくGcImeManagerのイベントを使って連携するようにしたいと思います。

 なお、コードによる連携でもBindingによるものでも、『本名欄』のXAML定義に記述したGcImeManager関連の定義は同じになります。

リスト9 コードでのふりがな連携の例
Private WithEvents current As GrapeCity.Windows.InputMan.GcImeManager

Private Sub MainPanel_Loaded(ByVal sender As System.Object,
                             ByVal e As System.Windows.RoutedEventArgs)
       :
      (中略)
       :
    Me.current = GrapeCity.Windows.InputMan.GcImeManager.Current
End Sub

Private Sub Current_ResultStringChanged(ByVal sender As Object,
                            ByVal e As GrapeCity.Windows.InputMan.ResultStringEventArgs) _
                                Handles current.ResultStringChanged
    If TypeOf e.Source Is GrapeCity.Windows.InputMan.GcTextBox AndAlso
        e.Source.Name = "Name_TextBox" Then
        Local.Kana += e.ReadString
    End If
End Sub

 GcImeManagerが『本名欄』からふりがなを受信すると、ResultStringChangedイベントが発生します。そのイベントで、Current_ResultStringChangedイベントプロシージャが起動されるとName_TextBoxでの入力かを確認してから、e.ReadStringを『フリガナ欄』に追記します。

検証インジケータ

 検証インジケータは、Bindingを使って各コントロールのイベントで検証する事もできます。今回のサンプルでは、[登録]ボタンをクリックしたときに一括して必須項目が未入力かどうかを判定しています。

 このように[登録]ボタンをクリックするなど利用者が一息ついたタイミングで一括してチェックするというのも、入力をしてもらいやすくする工夫の一つです。もちろん、そのためにはFormatプロパティやAutoConvertプロパティを駆使して、正しい入力がそれぞれの欄で行いやすくしておく必要があります。

図9 ボタンクリックでの検証インジケータ
図9 ボタンクリックでの検証インジケータ

まとめ

 InputMan for Silverlightを使えば業務アプリケーション、例えば、インターネットから注文するときの『住所入力欄』や『クレジットカード入力欄』などにおける、利用者の「何を入れていいの?」という負担を軽減できると思います。

 負荷の軽減とは、つまりは「面倒だからいいか」と注文してもらえず(または資料請求などが行われず)チャンスを逃すことにつながってきます。日本におけるSilverlightの普及率が70%を超えている現状を考えると、HTMLベースのシンプルな画面だけではなくInputMan for Silvelgihtを使った使いやすい画面の提供も必須な部類になりつつあるのではないでしょうか。

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/5665 2010/12/28 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング