グラフィックス 目次

Size: px
Start display at page:

Download "グラフィックス 目次"

Transcription

1 WPF 入門 第 4 回 WPF の リソース スタイル テンプレート を習得しよう 前回説明した依存関係プロパティは ほかの要素の値に依存してプロパティの値を決定する機構 といえる WPF ではこの仕組みを基軸として リソース スタイル コントロール テンプレートなどの高度な機能を提供している 特に WPF の柔軟性を象徴する機能がコントロール テンプレートで この機能を用いることでコントロールの外観を自由自在にカスタマイズ可能となる Windows フォームなどの既存の GUI 作成フレームワークでは コントロールに対して背景色やフォント サイズの変更など 限定的なカスタマイズしかできなかった これに対して WPF のコントロール テンプレートは 外観をほぼ無制限にカスタマイズできるポテンシャルを秘めている 今回は これらの WPF の高度な機能について説明していく リソース WPF では 複数の UI 要素で 1 つのオブジェクトを共有するために リソースという仕組みを持っている 例として 背景色を指定するためのブラシ ( 具体的には <SolidColorBrush> 要素 ) を 2 つの <Button> 要素で共有する XAML コードを List 1 に示す この XAML コードの表示結果は Figure 1 のようになる <Window x:class="wpfapplication1.mainwindow" xmlns=" xmlns:x=" Title="MainWindow" Height="100" Width="200"> <Window.Resources> <SolidColorBrush x:key="mybrush" Color="Blue"/> </Window.Resources> <StackPanel> <Button Content="Button 1" Background="StaticResource MyBrush"/> <Button Content="Button 2" Background="StaticResource MyBrush"/> </StackPanel> </Window> List 1: リソースによるブラシの共有 -1-

2 Figure 1: List 1 の XAML コードの表示結果 このように リソースを用いてオブジェクトを共有することで インスタンス生成などのオーバーヘッドを削減できる 上述の例では 青色のブラシを 1 つだけ生成して共有しており 2 つの <Button> 要素でそれぞれ個別にブラシを作るよりも生成されるインスタンスが少ない また リソースは UI 要素に対する設定を一カ所に集めることで 保守を容易にする 上述の例でいうと リソース中で定義されたブラシを変更するだけで これを参照する 2 つの <Button> 要素の背景色を一斉に変更できる 2 種類の リソース リソース という言葉が混乱を招く場合もあるので ここで補足的な説明を入れておく Windows アプリケーションでは 実行可能ファイル (=.EXE ファイル ) などのアセンブリの中に画像などのバイナリ ファイルを埋め込むための リソース 機構を持っている この仕組みは WPF アプリケーションでももちろん利用できる この機構と 本稿で説明する WPF のリソース機構を区別する際には 以下のように呼び変える アセンブリ リソース : アセンブリの中にバイナリ ファイルを埋め込むためのリソース機構 バイナリ リソースなどとも呼ぶ オブジェクト リソース : 本稿で説明する.NET オブジェクトを複数の UI 要素から参照するためのリソース機構 本稿では 単に リソース と呼ぶ場合には こちらを指すものとする リソース定義 List 1 でも示したように リソースは <Window> などの要素 ( 正確には FrameworkElement 型を継承する要素 ) の Resources プロパティ内に定義する Resources プロパティは ResourceDictionary 型 (System.Windows 名前空間 ) で この型はキーも値も object 型の辞書となっている 連載第 2 回で説明したように XAML コード中で IDictionary インターフェイスを実装する要素に子要素を追加する際には x:key XML 属性の指定が必須となる ただし 後述する Style クラス ( System.Windows 名前空間 ) のように ( クラスに対して ) DictionaryKeyProperty 属性 (DictionaryKeyPropertyAttribute) を付与して (x:key XML 属性の ) 代替となるプロパティ (Style クラスの場合は TargetType プロパティ ) を設定しているクラスの場合には x:key XML 属性の指定を省略可能である 例えば List 2 で示している Style クラスでは x:key XML 属性の代替として TargetType プロパティを利用している (<Style> 要素の TargetType プロパティについては 後述のスタイルの節で詳しく説明する ) <Window x:class=" WpfApplication1.MainWindow" -2-

3 xmlns=" xmlns:x=" <Window.Resources> <!-- x:key の指定が必須 --> <SolidColorBrush x:key="brush1" Color="Green" /> <!-- TargetType が x:key の代わりに利用される --> <Style TargetType="Button"> <Setter Property="Background" Value="LightBlue" /> </Style> </Window.Resources> <Grid> <Button Content=" ボタン "/> </Grid> </Window> List 2: リソースの定義例 外部リソースの取り込み リソースは <Windows.Resources> タグの中に直接定義する以外に ルート要素が ResourceDictionary 型の XAML ファイルを別途用意して この XAML ファイルを取り込む形で利用することもできる ( 外部リソース ) 外部リソースの定義例を List 3 に示す ここでは この XAML ファイルに Styles.xaml という名前を付けて保存するものとする <ResourceDictionary xmlns=" xmlns:x=" <Style TargetType="Button"> <Setter Property="Background" Value="LightBlue" /> </Style> </ResourceDictionary> List 3: 外部リソースの定義例 (Styles.xaml) 利用側が外部リソースを取り込むには List 4 に示すように <ResourceDictionary> 要素に Source 属性を付けることで行う <Window x:class=" WpfApplication1.MainWindow" xmlns=" xmlns:x=" -3-

4 <Window.Resources> <ResourceDictionary Source="Styles.xaml"/> </Window.Resources> <Grid> <Button Content=" ボタン "/> </Grid> </Window> List 4: 外部リソースの取り込み例 また ResourceDictionary.MergedDictionaries プロパティを用いることで 複数のリソース ディクショナリを 1 つに結合することもできる 例えば Styles.xaml に加えてもう 1 つ Brushes.xaml という名前の外部リソースを用意したものとして これらの外部リソース両方を取り込むためには List 5 に示すような XAML コードを記述する この例では 外部リソースに加えて さらにローカルでリソース ディクショナリを結合している <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="Styles.xaml"/> <ResourceDictionary Source="Brushes.xaml"/> <ResourceDictionary> <SolidColorBrush x:key="localresource" Color="Red" /> </ResourceDictionary> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> List 5: 複数のリソース ディクショナリの結合 ちなみに 通常 リソースはインスタンスが 1 つだけ生成され そのただ 1 つのインスタンスが複数の UI 要素から参照されることになる この挙動を変更したい場合 List 6 に示すように x:shared XML 属性を false に設定することで リソースが参照されるたびに別のインスタンスが生成されるようにすることも可能である <Grid.Resources> <SolidColorBrush x:shared="false" x:key="brush1" Color="Blue" /> </Grid.Resources> <Button Content=" ボタン 1" Background="StaticResource Brush1" /> <Button Content=" ボタン 2" Background="StaticResource Brush1" /> List 6: リソースのインスタンスを毎度生成する例 リソース利用 リソースを参照するためには StaticResource マークアップ拡張もしくは DynamicResource マークアップ拡張を利用する 実行時に値を変化させる必要のないものには StaticeResource マークアップ拡張 -4-

5 を用いる 一方 DynamicResource は 実行時に値が変化し その変化を参照している要素に反映させる必要がある場合に用いる リソースの検索は 親要素を下から上に階層的にたどって行われる List 7 に示すように 同名のキーを持つリソース ディクショナリがあった場合 Figure 2 に示すように 内側のスコープ ( 階層的に下 ) にあるリソースが優先的に利用される <Window x:class=" WpfApplication1.MainWindow" xmlns=" xmlns:x=" <Window.Resources> <SolidColorBrush x:key="brush1" Color="Red" /> <SolidColorBrush x:key="brush2" Color="Red" /> </Window.Resources> <StackPanel> <StackPanel.Resources> <!-- 内側のリソースを優先的に利用するため ボタン 2 にはこちらのブラシが反映される --> <SolidColorBrush x:key="brush2" Color="Blue" /> </StackPanel.Resources> <Button Content=" ボタン 1" Background="StaticResource Brush1"/> <Button Content=" ボタン 2" Background="StaticResource Brush2"/> </StackPanel> </Window> List 7: リソースの利用例 ( リソース検索の優先度 ) -5-

6 Figure 2: リソース参照の仕組み システム リソース XAML コードの中で定義したリソースに加えて 個人設定 などで設定されたシステム色やフォントなどの システム リソースも利用できる システム リソースを利用するには以下のクラス ( いずれも System.Windows 名前空間 ) を使用する SystemColors: システム色やブラシを取得する SystemFonts: システム フォントを取得する SystemParameters: ウィンドウの境界線やキャプションの幅などのシステム設定を取得する システム リソースは SystemColors.DesktopBrush などの静的プロパティを通して直接取得することもできるが これを StaticResource マークアップ拡張などでリソース参照するためのキーとして SystemColors.DesktopBrushKey などの静的プロパティが用意されている 例えば List 8 に示すような XAML コードでデスクトップの背景色を利用できる <Window x:class="wpfapplication1.mainwindow" xmlns=" xmlns:x=" Title="MainWindow" Width="200" Height="200"> <Grid Background= "DynamicResource x:static SystemColors.DesktopBrushKey"> </Grid> </Window> List 8: システム リソースの利用例 ( デスクトップの背景色の取得 ) この例では DynamicResource マークアップ拡張を利用しているが こうすることで アプリケーション起動中にエンド ユーザーがデスクトップの背景色を変更した際に その変更がアプリケーションに即座に反映される 例えば List 8 の表示結果は Figure 3 のようになる この例では デスクトップの背景色を灰色からピンクに変更している -6-

7 Figure 3: List 8 の表示結果 ( システム設定の変更を即座に反映 ) スタイル WPF は HTML でいうところの CSS のようなスタイル設定の機構を持っている CSS 同様 WPF でもスタイルを用いることで UI 要素の外観をカスタマイズ可能である スタイルの定義 WPF のスタイルは List 9 に示すように <Setter> 要素 (= プロパティの値を設定するための要素 ) のリストとして定義する <Style> 要素の TargetType プロパティにはスタイルを適用したい型の名前を指定する また <Setter> 要素の Property プロパティおよび Value プロパティに それぞれ対象とするプロパティ名と値を指定する <Style TargetType="Button"> <Setter Property="Background" Value="DarkSeaGreen" /> <Setter Property="Foreground" Value="LightPink" /> </Style> List 9: スタイルの定義例 これまでの XAML エディタでは <Setter> 要素に対する IntelliSense が効かず プロパティ名を覚えていなければスタイル設定ができないという もどかしい状態が続いていた しかし 最新の Silverlight 4 Tools for Visual Studio 2010 をインストールすることで WPF の XAML エディタも同時に更新され Figure 4 に示すように <Style> 要素に対する IntelliSense が有効になる (Visual Studio 2010 から WPF と Silverlight の XAML エディタが共通化された Silverlight Tools の更新で WPF も同時に更新されるのはこのためである ) -7-

8 Figure 4: <Style> 要素に対する IntelliSense スタイルの適用 FrameworkElement クラス (System.Windows 名前空間 ) には Style プロパティがあり この Style プロパティに値を設定することで 定義したスタイルを適用できる スタイルは FrameworkElement クラスの Style プロパティに対して直接記述することもできるが 通常は 本稿の前半で解説したリソースの中で定義して利用する スタイルとリソースは非常に相性がよく リソースの中でスタイルを定義することで 複数の UI 要素にスタイルを一斉適用可能である 特に リソース中に x:key XML 属性を指定しないスタイルを定義することで TargetType プロパティで指定した型の要素すべてに自動的にスタイルが適用される この 3 種類のスタイル利用 ( 自動適用 明示的なリソース指定 直接記述 ) の例を List 10 に また その表示結果を Figure 5 に示す <StackPanel> <StackPanel.Resources> <!-- x:key なしのスタイルを定義することで TargetType で指定した型すべてにスタイルを適用する --> <Style TargetType="Button"> <Setter Property="Background" Value="LightBlue" /> <Setter Property="Foreground" Value="Red" /> </Style> <!-- x:key の明示 --> <Style x:key="mybuttonstyle" TargetType="Button"> <Setter Property="Background" Value="DarkSeaGreen" /> <Setter Property="Foreground" Value="LightPink" /> </Style> </StackPanel.Resources> <!-- スタイルの自動適用 --> <Button Content=" ボタン 1" /> <!-- x:key を指定して明示的にスタイルを適用 --> <Button Style="StaticResource MyButtonStyle" Content=" ボタン 2" /> <!-- スタイルを直接記述 --> <Button Content=" ボタン 3"> <Button.Style> <Style TargetType="Button"> <Setter Property="Background" Value="Gray" /> </Style> </Button.Style> -8-

9 </Button> </StackPanel> List 10: スタイルの利用例 Figure 5: List 10 の表示結果 スタイルの継承 <Style> 要素は BasedOn プロパティを指定することで ほかのスタイルを継承できる この仕組みにより スタイルを部分的に書き換えたり <Setter> 要素を追加したりといったことが可能だ List 11 にスタイルの継承例を また Figure 6 にその表示結果を示す この例では 背景色および前景色を指定するスタイルを継承し さらにフォント サイズを指定するスタイルを定義している <StackPanel Width="90"> <StackPanel.Resources> <Style TargetType="Button"> <Setter Property="Background" Value="LightBlue" /> <Setter Property="Foreground" Value="Red" /> </Style> <!-- 自動適用版のスタイルを基にして 新たにスタイルを作成 --> <Style x:key="mybuttonstyle" TargetType="Button" BasedOn="StaticResource x:type Button"> <Setter Property="FontSize" Value="20" /> </Style> </StackPanel.Resources> <Button Content=" ボタン 1" /> <Button Style="StaticResource MyButtonStyle" Content=" ボタン 2" /> </StackPanel> List 11: スタイルの継承の利用例 Figure 6: List 11 の表示結果 トリガー スタイルの作成では 特定の条件下でのみ働くスタイルを定義したいという場面がしばしば出てくる -9-

10 例えば マウス カーソルが上に乗っているときや クリックされたときだけスタイルを変えたい というような要求は必ずといっていいほど出るだろう このような要求に応えるため WPF のスタイルではトリガーという仕組みを持っている 具体的には <Style> 要素の Triggers プロパティを設定することで 特定の条件下でのみ働くスタイルを定義することができる 例えば List 12 のような XAML コードにより マウス カーソルが上に乗ったときだけ水色に フォーカスを得ているときだけピンク色に変化するテキストボックスが得られる <StackPanel Width="60"> <StackPanel.Resources> <Style TargetType="TextBox"> <Setter Property="Background" Value="LightGray" /> <Style.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="Background" Value="LightBlue" /> </Trigger> <Trigger Property="IsFocused" Value="True"> <Setter Property="Background" Value="LightPink" /> </Trigger> </Style.Triggers> </Style> </StackPanel.Resources> <TextBox Text=" テキスト " /> </StackPanel> List 12: トリガーを用いた条件付きのスタイル適用例 <Style.Triggers> 要素中に記述できるのは Trigger クラスだけではなく 以下のようなものがある ( いずれも System.Windows 名前空間中のクラス ) Trigger: 特定のプロパティの値の変化をトリガーとして Setter を用いてプロパティ値を変更する MultiTrigger: Trigger を複数条件に対応させたもの 指定したすべての条件が満たされた場合にトリガーがかかる DataTrigger: スタイル適用先の UI 要素だけでなく データ バインディングされたデータを監視する MultiDataTrigger: DataTrigger の複数条件版 EventTrigger: プロパティ値の変化ではなく イベントの発生をトリガーとする また Setter ではなくストーリーボードを使ったアニメーションによりプロパティ値を変化させる データ バインディングやアニメーションに関しては次回以降で説明する EventTrigger に関しても アニメーションの回にあらためて説明を行う また WPF 4 では 状態の変化に応じたスタイルの変更を管理するために 新たに VisualStateManager というクラスが追加された この VisualStateManager クラスは もともとは Silverlight で実装されたものだが.NET Framework 4 で WPF にも輸入されることになった VisualStateManager クラスの利用にはアニメーションの知識が必要なため Trigger クラスを利用す -10-

11 るより少し難易度は高いが *1 状態の管理が行いやすく 可能ならばこちらを用いた方がいいだろう VisualStateManager クラスに関しても アニメーションの回で説明する予定である *1 Visual Studio の XAML エディタにはアニメーション作成をサポートする機能がなく 複雑なアニメーションの作成が必要な場合には Expression Blend の利用を考えてみるべきであろう コントロール テンプレート スタイルを用いることで コントロールなどの外観をカスタマイズできるが 前節で説明したような単純なプロパティ値の変更だけでは カスタマイズ可能な範囲は極めて限られている 背景色などの変更程度であれば 従来の GUI 作成フレームワークでもある程度可能な範囲である WPF のスタイルには トリガーを用いた 状態の変化に応じたスタイル適用 などの先進的な機能もあるものの まだ驚く範囲ではないだろう Windows フォームなど 従来の GUI 作成フレームワークでは 出来合いのコントロールを用いることで高い生産性を得ていたが その半面 カスタマイズ性は非常に限られていた 結果として 大幅なカスタマイズが必要な場合には 新たなコントロールを 1 から自作する必要があった この場合 外観の新規作成だけでなく 例えば ボタンのクリック や テキストの選択 などの機能面まで含めて作り直す必要があり 非常に負荷の高い作業となる これに対して WPF では コントロール テンプレートという機能を用いることで ボタンのクリック などの機能を残したまま 外観だけを任意に変更可能である コントロール テンプレートの利用 まず 最低限のコントロール テンプレートを見てみよう List 13 に ボタンの外観を水色のだ円形に変えるテンプレートを示す ボタンなどのコントロールの基底となる Control クラス (System.Windows.Controls 名前空間 ) は Template というプロパティを持っていて この Template プロパティに ControlTemplate クラス (System.Windows.Controls 名前空間 ) のインスタンスを設定すればよい <Button> <Button.Template> <ControlTemplate TargetType="Button"> <Ellipse Fill="LightBlue" Width="80" Height="30"/> </ControlTemplate> </Button.Template> </Button> List 13: ボタンの外観を水色のだ円形に変えるテンプレート この程度の例であれば 単純にだ円 (=<Ellipse> 要素 ) に Mouse.MouseDown イベントを追加した方が似たようなことを手早く実現できるかもしれない ただ Button クラスなどのコントロールの場合 次回以降で説明する コマンド という仕組みも持っているため これを利用したければ やはりコントロール テンプレートを使うことになるだろう Button クラスなどのコントロールや Ellipse クラスなどの シェイプ に関する詳細は次回以降で説明する -11-

12 コントロール テンプレートのリソース化と自動適用 もちろん コントロール テンプレートもリソース化可能である List 14 に コントロール テンプレートをリソース化する例を示す <StackPanel> <StackPanel.Resources> <ControlTemplate x:key="mybuttontemplate" TargetType="Button"> <Ellipse Fill="LightBlue" Width="80" Height="30"/> </ControlTemplate> </StackPanel.Resources> <Button Template="StaticResource MyButtonTemplate" /> </StackPanel> List 14: コントロール テンプレートのリソース化の例 また スタイルと組み合わせることで コントロール テンプレートの自動適用も可能だ List 15 にその例を示す <StackPanel> <StackPanel.Resources> <!-- 自動適用スタイル --> <Style TargetType="Button"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="Button"> <Ellipse Fill="LightBlue" Width="80" Height="30"/> </ControlTemplate> </Setter.Value> </Setter> </Style> </StackPanel.Resources> <!-- 以下のボタンには 自動的にコントロール テンプレートが設定される --> <Button /> </StackPanel> List 15: コントロール テンプレートの自動適用例 ContentPresenter と TemplateBinding それでは もう少し複雑な例を見てみよう 前述の最低限の例では <Button> 要素の Content プロパティを設定してもボタンの中身が表示されなくなってしまうという問題がある また だ円形の色も水色に固定されてしまっている そこで List

13 に示すような修正が必要となる <StackPanel Width="80"> <StackPanel.Resources> <Style TargetType="Button"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="Button"> <Grid> <Ellipse Fill="TemplateBinding Background"/> <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/> </Grid> </ControlTemplate> </Setter.Value> </Setter> </Style> </StackPanel.Resources> <Button Content=" ボタン 1" Background="LightBlue" Height="30" /> <Button Content=" ボタン 2" Background="LightPink" Height="30" /> </StackPanel> List 16: ContentPresenter と TemplateBinding 以下の 2 つがポイントとなる <ContentPresenter> 要素 : この要素が置かれた位置にコントロールの中身 (=Content プロパティに与えた値 ) が配置される TemplateBinding マークアップ拡張 : コントロール テンプレートの適用先のコントロールに与えられたプロパティ値を取得するために利用する 上記のコード例では <ContentPresenter> 要素により <Grid> 要素内の水平 / 垂直方向の中央に <Button> 要素の Content プロパティの値 ( 具体的には ボタン 1 と ボタン 2 ) が表示され さらに TemplateBinding マークアップ拡張によって コントロール テンプレートの適用先である <Button> 要素の Background プロパティの値 ( 具体的には LightBlue と LightPink ) が取得されて用いられる Figure 7 に その表示結果を示す Figure 7: List 16 の表示結果 ルーティング コマンド スクロールバーのように 挙動が少し複雑なコントロールに対してコントロール テンプレートを適用 -13-

14 する場合 ルーティング コマンド という仕組みを利用することになる ルーティング コマンドの詳細については次回以降で説明することになるが 簡単にいうと ページ アップ や 端までスクロール などといった操作が発生したことを親要素に伝達するための仕組みである ここでは参考程度のコード提示にとどめるが ScrollBar クラスに対してコントロール テンプレートを適用する例を List 17 に示す <Grid Width="150" Height="150"> <Grid.Resources> <ControlTemplate x:key="verticalscrollbartemplate" TargetType="ScrollBar"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="15"/> <RowDefinition Height="*"/> <RowDefinition Height="15"/> </Grid.RowDefinitions> <RepeatButton Command="ScrollBar.LineUpCommand" Background="LightBlue" /> <Track Grid.Row="1" IsDirectionReversed="True"> <Track.DecreaseRepeatButton> <RepeatButton Command="ScrollBar.PageUpCommand" Background="Red" /> </Track.DecreaseRepeatButton> <Track.Thumb> <Thumb Background="Blue" /> </Track.Thumb> <Track.IncreaseRepeatButton> <RepeatButton Command="ScrollBar.PageDownCommand" Background="Green" /> </Track.IncreaseRepeatButton> </Track> <RepeatButton Command="ScrollBar.LineDownCommand" Background="LightPink" Grid.Row="2" /> </Grid> </ControlTemplate> <Style TargetType="ScrollBar"> <Style.Triggers> <Trigger Property="Orientation" Value="Vertical"> <Setter Property="Template" Value="StaticResource VerticalScrollBarTemplate" /> </Trigger> </Style.Triggers> </Style> </Grid.Resources> <ScrollViewer HorizontalScrollBarVisibility="Visible"> -14-

15 <Ellipse Width="500" Height="500" Fill="Gray" /> </ScrollViewer> </Grid> List 17: ScrollBar へのコントロール テンプレートの適用例 WPF Themes(WPF テーマ ) コントロール テンプレートの仕組みは高機能で 柔軟なカスタマイズが可能ではあるが これをすべてのコントロールに対して 1 から定義するのは非常に大変な作業となる 自作ではなく 出来合いのものをどこかから探してきて利用する方が現実的かもしれない ありがたいことに Codeplex においてフリーの WPF テーマが公開されている コントロール テンプレートの利用の際には参考にしてみるのもいいだろう WPF Themes 次回はデータ バインディングの仕組みや具体的な用途について説明を行っていく 第 5 回 WPF の データ バインディング を理解する 今回および次回の 2 回に渡り ビューとモデルの疎結合を実現するための仕組みとして データ バインディングとコマンドという 2 つの機能について説明する まず今回は これらの機能の背景にある GUI アプリケーションに対する要件と データ バインディングについて説明を行っていく GUI アプリケーションに対する要件 WPF のデータ バインディングやコマンドといった仕組みを説明する前に そもそも GUI アプリケーションに対して どのような要件があるのかを整理してみよう ここでは 実装上で満たすべき要件として ビューとモデルの疎結合 と GUI アプリケーションに求められる機能 ( の中で 今回はデータ バインディングに関係する部分 ) を紹介する ビューとモデルの疎結合 GUI アプリケーション開発においてよくいわれる言葉として ビュー (view) とモデル (model) を疎結合にしろ というものがある すなわち アプリケーションの見た目にかかわる部分 (= ビュー ) と 見た目と関係なく成り立つロジックや表示したいデータ (= モデル ) を分けるのが良いとされる オブジェクト指向言語の場合には ビューとモデルを別クラスとして表現し 互いのクラスに参照関係を作らないことを指す ( そうすることで 再利用性やテスト可能性が向上する ) 単に モデル というと意味が広すぎるが 要は 業務を分析し モデル化して得られたデータ (= ドメイン モデル ) を指す言葉だ アプリケーションの種類によっては モデルという言葉がしっくりこないかもしれないが (GUI であろうと CUI(character-based user interface) であろうと ) 表示や操作の方法にかかわらず変わらない部分を独立させ その部分を指して モデル と呼んでいると思えばいいだろう GUI アプリケーションに求められる機能 -15-

16 データ バインディングと関連して GUI アプリケーションに求められる機能としては 以下のようなものがある 同じデータを複数のウィンドウやコントロールから参照 通常 モデルの持っているデータをビュー上に表示する方法は 1 通りではない 例えば 同じデータを テーブルに表示したい場合もあれば 折れ線グラフなどで表示したい場合もあるだろう また テーブルとグラフを同時に表示したうえで テーブル上での値の変更が即座にグラフ側に反映されてほしい場合も少なくないだろう Visual Studio を例にとって 1 つ具体例を挙げるなら XAML エディタがまさにこのような挙動になっている Figure 1 に示すように この XAML エディタは マウスを使って視覚的にデザインするための デザイン 画面 ( 画像上部 ) と XAML コードを文字ベースで入力する XAML 画面 ( 画像下部 ) を持っている そして どちらか片方への変更があった場合 もう一方に即座に変更結果が反映される -16-

17 Figure 1: 同じデータを複数のコントロール上に表示する例 (XAML エディタ ) このような機能を実現するためには データの変更を通知するような仕組みが必要で このために WPF は データ バインディング という仕組みを持っている ( また 次回説明する コマンド も ビューとモデルの疎結合を保つために有用である ) 次節以降では このデータ バインディングについて説明していく データ バインディング WPF では データ ソース (= モデルなどの データの提供元 ) をビュー (=WPF の場合は XAML コード ) 上の UI 要素と簡単に結び付けるために データ バインディングという仕組みを提供している バインディング (binding: 結合 ) や 結び付ける という言い方をしているが これは 値を一度だけ代入するのではなく 1 カ所で値が変化するたびに ほかの個所にもその変化が即座に伝搬される ということを指している 具体的には 以下のような手順でデータ ソースと UI 要素を結び付ける (Figure 2) XAML コード中に このプロパティの値をここに表示する という印だけを入れておく 表示したいデータ ソースは DataContext プロパティを通じてビューに渡す Figure 2: データ バインディングの利用方法 アプリケーションの要件によっては モデルのインスタンスをそのまま DataContext プロパティに渡すだけでよい 例えば モデルが最初から WPF 向けに作られている場合や 後述する INotifyPropertyChanged インターフェイスなどの仕組みを必要としない単純な要件の場合などである ただし実際には このような場合に該当することはあまりなく WPF 向けにモデルをラッピングしたもの (= ビュー モデルと呼ぶ ) を作って これを DataContext プロパティに渡すことになる データ バインディングの使い方 それでは データ バインディングの具体例を見てみよう まず List 1 に示すように XAML コード中に Binding マークアップ拡張を使って このプロパティの値をここに表示する という印を入れてお -17-

18 く <Window x:class="atmarkit05.minimalsamplewindow" xmlns=" xmlns:x=" Width="100" SizeToContent="Height" Title=" ウィンドウ名 "> <StackPanel> <TextBlock Text="Binding X" /> <TextBlock Text="Binding Y" /> </StackPanel> </Window> List 1: データ バインディングの利用例 (XAML) <TextBlock> 要素の Text プロパティに対して Binding X と書くことで Text プロパティの値と X プロパティの値を結び付ける という意味になる 次に FrameworkElement クラス (System.Windows 名前空間 )(Window クラスもこのクラスを継承している ) の DataContext プロパティにデータ ソースを渡す 今回は List 2 に示すように 分離コード中のビュー クラス (Window クラスを継承 ) のコンストラクタで DataContext プロパティに匿名クラスを使って渡す ( ただし 実際には データの差し替えやテストのしやすさを考えると ビュー クラスの外でデータ ソースを渡す方が好ましい ) 実行結果は Figure 3 のようになる Visual Basic Namespace atmarkit05 Class MinimalSampleWindow Sub New() InitializeComponent() Me.DataContext = New With.X = 10,.Y = 20 End Sub End Class End Namespace Visual C# using System.Windows; namespace atmarkit05 public partial class MinimalSampleWindow : Window public MinimalSampleWindow() InitializeComponent(); this.datacontext = new X = 10, Y = 20 ; -18-

19 List 2: データ バインディングの利用例 ( 分離コード ) Figure 3: List 1 の表示結果 このように 単にデータを表示するだけなら何も特殊な実装は必要ない ( 後述するような INotifyPropertyChanged インターフェイスの実装は不要 ) また 同名のプロパティさえ持っていればよく 具体的な型が何かは問われない 従って この例のように匿名クラスであっても構わない ( ただし 匿名クラスが利用できるのはアプリケーションが完全信頼で動作している場合のみ ) ここで DataContext プロパティの値は包含継承 ( 親 UI 要素から値が引き継がれる ) されていて ビュー クラスの DataContext プロパティに渡したデータ ソースは <TextBlock> 要素の DataContext プロパティにも引き継がれている Binding X というマークアップ拡張記述の実体としては その UI 要素の DataContext プロパティに格納されているオブジェクトの X プロパティを参照することになる バインディングのソースとターゲット データ バインディングを行ううえで データの提供元 (= ソース ) となるものと 反映先 (= ターゲット ) となるものができるが 混乱を避けるため Figure 4 に示すように用語を定める バインディング ソース : データの提供元のオブジェクト ソース プロパティ : データの提供元となる バインディング ソースのプロパティ バインディング ターゲット : データの反映先のオブジェクト ターゲット プロパティ : データの反映先となる バインディング ターゲットのプロパティ -19-

20 Figure 4: データ バインディングのソース / ターゲットに関する用語 まず WPF のデータ バインディングにおいて ターゲット プロパティは依存関係プロパティでなければならない 幸い WPF で XAML コード中に記述する要素のプロパティは 大部分が依存関係プロパティになっていて ターゲット プロパティにすることが可能である ( ただし InputBinding クラス (System.Window.Input 名前空間 ) の Command プロパティのように.NET Framework 3.5 までは依存関係プロパティになっておらず.NET Framework 4 で初めてターゲット プロパティにできるようになったものもある ) 一方で バインディング ソースには以下のようなものが利用可能である CLR オブジェクト : 通常の CLR オブジェクトのプロパティやインデクサをソース プロパティにできる ( アクセス修飾子は public である必要がある また フィールドは利用できない ) プロパティ値の取得や更新はリフレクションを介して行われる あるいは ICustomTypeDescripter インターフェイスを実装する場合や TypeDescriptionProvider クラスを使って型情報を WPF に対して登録している場合 ( いずれのクラスも System.ComponentModel 名前空間 ) には これらを介して値の取得 更新が行われる また 値の変更を通知するためには INotifyPropertyChanged インターフェイス (System.ComponentModel 名前空間 ) を実装する必要がある 依存関係オブジェクト : ソース プロパティに依存関係プロパティを用いる場合 パフォーマンスもよく 標準で値の変更を通知する仕組みも備えている ただし 依存関係プロパティを利用するためには バインディング ソースが依存関係オブジェクトである (DependencyObject を継承している ) 必要がある ( その結果 ほかのクラスを継承できなくなる ) という問題もある XML オブジェクト : Binding マークアップ拡張の指定の仕方によっては (Source プロパティと XPath プロパティを利用 ) XML オブジェクトを直接バインディング ソースにすることができる 動的オブジェクト :.NET Framework 4 からは IDynamicMetaObjectProvider インターフェイスを実装する動的オブジェクトもバインディング ソースに指定可能になった すなわち IronPython や IronRuby などの動的言語を用いて作成したオブジェクトを そのままバインディング ソースにできる 実際のところ CLR オブジェクトをバインディング ソースとして利用する場合が多いだろう そこで重要になるのが INotifyPropertyChanged インターフェイスを利用した値の変更通知である この INotifyPropertyChanged インターフェイスの実装方法については 次回で説明する それでは 次のページからは Binding マークアップ拡張の書き方について詳しく説明していこう Binding マークアップ拡張の書き方 これまでの例では Binding マークアップ拡張を単に Binding X というように記述してきたが Binding マークアップ拡張にはさまざまなプロパティがあり データ バインディングの挙動を細かく設定することができる 以下 主要なものをいくつか紹介していく データ バインディングの向きとタイミング Mode プロパティで データ バインディングの向きとタイミングを指定できる Mode プロパティに対して設定できる値は以下のとおりである OneTime: UI 要素生成時に一度だけ ソース プロパティの値を読み出してターゲット プロパテ -20-

21 ィに与える OneWay: ソース プロパティが変更された際に ターゲット プロパティに変更を反映させる ( 逆は行わない ) OneWayToSource: ターゲット プロパティが変更された際に ソース プロパティに変更を反映させる TwoWay: ソース プロパティおよびターゲット プロパティのいずれの変更も 他方に反映させる 当然 TwoWay や OneWayToSource を指定するためには ソース プロパティが書き込み可能である (set アクセサを持っている ) 必要がある また TwoWay や OneWayToSource を指定した際には 変更をソース プロパティに反映させるタイミングを UpdateSourceTrigger プロパティで指定できる UpdateSourceTrigger プロパティに設定できる値は以下のとおりである Default: バインディング ターゲットの依存関係プロパティのメタデータに基づいてタイミングを決定する ( 何も指定しない場合 これが設定される ) PropertyChanged: バインディング ターゲットの値が変化するたびに ( 例えば テキストボックスの場合 1 文字入力されるたびに ) 変更を通知する LostFocus: バインディング ターゲットの要素がフォーカスを失うたびに ( 例えば テキストボックスからフォーカスを外した際に ) 変更を通知する Explicit: 明示的に UpdateSource メソッドを呼び出した場合にのみ変更を通知する バインディング ソースのパスの書き方 Path プロパティで バインディング ソースのパスを指定する Path プロパティは省略形で書くことができ これまで用いてきた Binding X という書き方は と同じ意味である Path プロパティでは 以下のような構文でパス指定が可能である Binding X.Y のように. でつなぐことで階層的なパス指定が可能 Binding X[0] のように 角カッコを用いてインデクサを利用可能 データ ソース (=DataContext に渡されたオブジェクト ) そのもののインデクサを利用する場合には Binding [0] というように Path プロパティに直接角カッコを記述する 引数が複数あるインデクサを利用する場合には <Binding Path="[3,4]" /> のように, を利用する ( ただし マークアップ拡張ではこの書き方はできない <Binding> 要素を使う必要がある ) 階層的なパス指定とインデクサは混在可能 ( Binding X[0].Y というような記述も可能 ) 添付プロパティをバインディング ソースにする場合には Binding (Canvas.Left) のように カッコでくくって ( 型名. プロパティ名 ) と記述する 例えば List 3 に示すように 階層的なデータを DataContext プロパティに渡した場合を考えてみよう Visual Basic Me.DataContext = New With -21-

22 . 管理者 = New With. 姓 = " 岩永 ",. 名 = " 信之 ",. コンテンツ = New With. タイトル = "C# 入門 ",.URL = "csharp", New With. タイトル = " 信号処理 ",.URL = "dsp", New With. タイトル = " 力学 ",.URL = "dynamics" Visual C# this.datacontext = new 管理者 = new 姓 = " 岩永 ", 名 = " 信之 ", コンテンツ = new[] new タイトル = "C# 入門 ", URL = "csharp", new タイトル = " 信号処理 ", URL = "dsp", new タイトル = " 力学 ", URL = "dynamics", ; List 3: 階層的なデータを DataContext に渡す このとき List 4 に示すような XAML コードを書くと Figure 5 に示すような表示結果が得られる 省略 <StackPanel x:name="panel" Canvas.Left="99"> <!-- 階層的なプロパティ指定 --> <TextBlock Text="Binding 管理者. 姓 "/> <!-- インデクサー --> <TextBlock Text="Binding コンテンツ [1].URL"/> <!-- 添付プロパティ --> <TextBlock Text="Binding ElementName=panel, Path=(Canvas.Left)"/> </StackPanel> 省略 List 4: パス指定の例 (XAML) Figure 5: List 4 の表示結果 -22-

23 コレクション走査パスの指定 Path プロパティでは Binding Path=List/X というように / でつなぐことで リストボックスなどで選択された行のプロパティを表示することができる ( コレクションを走査して 選択中の要素を拾い出してくれる ) 前節と同様に List 3 に示すデータを DataContext プロパティに渡した場合 List 5 に示すような XAML コードを書くと Figure 6 に示すような表示結果が得られる 省略 <StackPanel> <!-- / による選択行の表示を働かせるためには IsSynchronizedWithCurrentItem プロパティの指定が必要 --> <DataGrid ItemsSource="Binding Path= コンテンツ " IsSynchronizedWithCurrentItem="True" /> <!-- DataGrid コントロールで選択されている行の [ タイトル ] プロパティが表示される --> <TextBlock Text="Binding Path= コンテンツ / タイトル " /> </StackPanel> 省略 List 5: 階層的なデータを参照する Binding マークアップ拡張の書き方 (XAML) Figure 6: List 5 の表示結果 DataGrid コントロール内の行を選択すると その行データの [ タイトル ] 列の値が 下部のテキストボックスに表示される バインディング ソースの明示的指定 特に何も指定しない場合 バインディング ソースは UI 要素の DataContext プロパティに与えられたオブジェクトになる 一方で Binding マークアップ拡張の Source プロパティを設定することで バインディング ソースを明示的に指定することもできる 例えば List 6 に示すように 静的プロパティをバインディング ソースに指定するなどの用途で利用する -23-

24 省略 <StackPanel> <TextBlock Text="Binding Source=x:Static Application.Current, Path=StartupUri" /> </StackPanel> 省略 List 6: 静的プロパティをバインディング ソースに指定する例 (XAML) このコードを実行すると (Application クラス (System.Windows 名前空間 ) の Current 静的プロパティから得られる )Application オブジェクトの StartupUri プロパティ値 (= アプリケーションの起動時に自動的に表示される UI を参照する URI) が TextBlock コントロールに表示される Source プロパティのほかに 後述する ElementName プロパティや RelativeSource プロパティでもバインディング ソースを選択できるが これら 3 つのプロパティを同時に指定することはできない XPath バインディング ソースが XML データの場合 Path プロパティではなく XPath プロパティを利用する XPath プロパティには (XML に付随するパス指定言語である )XPath 言語 (XML Path Language) でクエリを記述する XPath クエリの書き方については本稿の範囲を超えるため 詳細は割愛し 例のみを List 7 に示す 省略 <Grid> <Grid.Resources> <XmlDataProvider x:key="pages" XPath="Pages"> <x:xdata> <Pages xmlns=""> <Page Title="C# 入門 " Url ="csharp" /> <Page Title=" 信号処理 " Url ="dsp" /> <Page Title=" 力学 " Url ="dynamics" /> </Pages> </x:xdata> </XmlDataProvider> </Grid.Resources> <ListBox ItemsSource= "Binding Source=StaticResource Pages, XPath=Page"> <ListBox.ItemTemplate> <DataTemplate> <TextBlock Text="Binding XPath=@Title"/> -24-

25 </DataTemplate> </ListBox.ItemTemplate> </ListBox> </Grid> 省略 List 7: XML データをバインディング ソースとして利用する例 (XAML) このコードを実行すると XML データの <Pages> 要素内の各 <Page> 要素の Title 属性値が リストボックスの各行に表示される ほかの UI 要素の参照 場合によっては モデルなどのデータ ソースを介さず UI 要素間で直接プロパティ値の同期を取りたいことがある このような場合に ElementName プロパティを指定することで ほかの UI 要素をバインディング ソースにしてデータ バインディングを行える 例えば List 8 に示すような XAML コードを書くことで テキストボックスに表示されるテキストと スライダーの値を同期できる ( スライダーのつまみを動かすと 即座にテキストが変化する ) 省略 <StackPanel> <TextBox x:name="textvalue" /> <Slider Value="Binding ElementName=textValue, Path=Text" /> </StackPanel> 省略 List 8: UI 要素間でのデータ バインディング (XAML) 自分自身や先祖要素の参照 RelativeSource プロパティを指定することで UI 要素自身や 先祖要素 (= 直接の親だけではなく 階層的にたどれる上位の要素すべて ) のプロパティをデータ ソースに指定することができる 利用例を List 9 に示す 省略 <StackPanel> <!-- 先祖をたどって <Window> 要素を見つけ その Title プロパティとバインディング --> <TextBlock Text="Binding RelativeSource=RelativeSource Mode=FindAncestor, AncestorType=Window, Path=Title" /> <!-- 自分自身の Width プロパティと Height プロパティをバインディング ( 要するに 正方形にする ) --> <Rectangle Fill="Blue" Width="50" Height="Binding RelativeSource=RelativeSource Self, Path=Width" /> </StackPanel> -25-

26 省略 List 9: RelativeSource の利用例 (XAML) このコードを実行すると TextBlock コントロールに先祖 <Window> 要素の Title プロパティ値が表示され その下に縦 横 50 ピクセルの青い正方形が表示される 値の変換 値そのままではなく 何らかの変換処理を行ってからデータ バインディングしたい場合もあるだろう そのような場合には Binding マークアップ拡張の Converter プロパティに IValueConverter インターフェイス (System.Windows.Data 名前空間 ) を実装するクラスを渡す 例えば 角度の度数 (degree) と弧度数 (radian: ラジアン ) の ( 双方向 ) 変換を考えてみよう まず List 10 に示すように IValueConverter インターフェイス実装クラスを用意する Visual Basic Public Class DegreeToRadianConverter Implements IValueConverter Public Function Convert(ByVal value As Object, ByVal targettype As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.Convert Dim x As Double = CType(value, Double) Return x / 180 * Math.PI End Function Public Function ConvertBack(ByVal value As Object, ByVal targettype As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.ConvertBack Dim x As Double = Double.Parse(CType(value, String)) Return (x / Math.PI * 180).ToString() End Function End Class Visual C# using System; using System.Windows.Data; using System.Globalization; namespace atmarkit05 public class DegreeToRadianConverter : IValueConverter -26-

27 public object Convert(object value, Type targettype, object parameter, CultureInfo culture) double x = (double)value; return x / 180 * Math.PI; public object ConvertBack(object value, Type targettype, object parameter, culture) double x = double.parse((string)value); return (x / Math.PI * 180).ToString(); List 10: 度と弧度を変換するためのクラス ( 上 :C# 下:VB) CultureInfo なお VB の場合 プロジェクト プロパティで設定した [ ルート名前空間 ] が atmarkit05 なっている必要がある このクラスを利用して List 11 に示すような XAML コードを記述することで 度と弧度の変換が可能になる 省略 <StackPanel xmlns:local="clr-namespace:atmarkit05"> <StackPanel.Resources> <local:degreetoradianconverter x:key="degtorad"/> </StackPanel.Resources> <Slider x:name="slider" Value="0" Minimum="0" Maximum="360" /> <TextBox Text="Binding ElementName=slider, Path=Value" /> <TextBox Text="Binding ElementName=slider, Path=Value, Converter=StaticResource DegToRad" /> </StackPanel> 省略 List 11: Converter プロパティを使った値の変換の例 (XAML) このコードを実行してスライダーを動かすと 上の TextBox コントロールに 0~360 の度数値が表示され その下の TextBox コントロールに ( 度数から変換された ) 弧度数が表示される なお VB の場合 プロジェクト プロパティで設定した [ ルート名前空間 ] が atmarkit05 なっている必要がある データ検証 Binding マークアップ拡張では エンド ユーザーから入力されたデータの検証を行うために 以下の 3 つのプロパティを利用する -27-

28 ValidationRules: ValidationRule クラス (System.Windows.Controls 名前空間 ) を継承するクラスを使って 明示的に検証ルールを追加する ValidatesOnExceptions: True に設定されている場合 ソース プロパティの更新中に例外が発生していないかを確認する ValidationRules プロパティに ExceptionValidationRule を追加した場合と同様の挙動になる ValidatesOnDataErrors: True に設定されている場合 IDataErrorInfo インターフェイスを介したデータ検証を有効にする ValidationRules プロパティに DataErrorValidationRule を追加した場合と同様の挙動になる データ検証の結果 何らかのエラーがあった場合には Validation.HasError 添付プロパティに True が設定され Validation.Errors 添付プロパティにエラーの一覧が格納される また WPF のコントロールのいくつかは 標準でデータ検証エラーに対応していて Figure 7 に示すように データ検証エラーがある場合にテキストボックスの枠線が赤くなるなどの変化が生じる (Validation.HasError 添付プロパティをトリガーとしたスタイルが定義されている ) Figure 7: データ検証エラー時のスタイル 数値をデータ バインディングしているテキストボックスに対して 不正な文字列を入力することで例外が発生している ValidatesOnException プロパティを True に設定することで このように テキストボックスの枠線が赤く変化する ( ただし この例で表示されているツールチップは 標準ではなく 追加でスタイルを定義している ) IDataErrorInfo インターフェイスの実装方法については 次回で説明する 続いて データ バインディングした単一のデータ / コレクション データの表示方法をカスタマイズできる データ テンプレート について説明する データ テンプレート 文字列や数値などの単純な型だけでなく 任意のデータ型を表示するための仕組みとして データ テンプレートというものがある 前回で説明したコントロール テンプレートと似ているが 名前どおり コントロール テンプレートがコントロールの表示方法をカスタマイズするものであるのに対して データ テンプレートはデータの表示方法をカスタマイズするものである ContentControl クラス : 単一のデータに対するデータ テンプレートの適用 まず 単一の ( コレクションではない ) データに対するテンプレートについて説明しよう 単一データに対するテンプレート指定は ContentControl クラス (Sytem.Windows.Control 名前空間 ) の Content プロパティにデータを ContentTemplate プロパティにデータ テンプレートを渡すことによって行う * * ちなみに Button クラスなどのコントロール類の多くは ContentControl クラスを継承していて こ -28-

29 のデータ テンプレートの仕組みを利用可能である ここでは 標準のクラス ライブラリで提供されているデータ型の中から 式ツリー (System.Linq.Expressions 名前空間以下のクラス ) を例にとって説明していく まず List 12 に示すように (x, y) => x + y という ( ラムダ式の ) 式ツリーを DataContext プロパティに渡す Visual Basic Dim sample As System.Linq.Expressions.Expression( _ Of Func(Of Integer, Integer, Integer)) = _ Function(x, y) x + y Me.DataContext = sample Visual C# System.Linq.Expressions.Expression<Func<int, int, int>> sample = (x, y) => x + y; this.datacontext = sample; List 12: 式ツリーをデータ ソースにする例 比較のために テンプレート指定のない場合にどうなるかを見てみよう List 13 に示すように Content プロパティのみを指定する ソース プロパティとして指定している Body プロパティには ラムダ式の本体部分 (= x + y の部分 ) が格納されている 省略 <StackPanel> <ContentControl Content="Binding Body" /> </StackPanel> 省略 List 13: データ テンプレートを指定しない場合 (XAML) データは <ContentControl> 要素の Content プロパティに指定する この場合 ただ単に (x + y) という文字列だけが表示されるはずだ これは 式ツリーを ToString メソッドで文字列化したものが表示されている それでは データ テンプレートを指定してみよう List 14 に示すように ContentTemplate プロパティに対して <DataTemplate> 要素を指定する Figure 8 に表示結果を示す データ テンプレートを指定しなかった場合もまとめて表示している 図中の上段が指定なし 下段が指定ありの場合の表示結果である 省略 <Grid> <ContentControl Content="Binding Body" Grid.Row="1" Grid.Column="1"> <ContentControl.ContentTemplate> <DataTemplate> -29-

30 <StackPanel Orientation="Horizontal"> <TextBlock Text="Binding NodeType" Background="LightBlue" /> <TextBlock Text=": " /> <TextBlock Text="Binding Left" Background="LightBlue" /> <TextBlock Text=", " /> <TextBlock Text="Binding Right" Background="LightBlue" /> </StackPanel> </DataTemplate> </ContentControl.ContentTemplate> </ContentControl> </Grid> 省略 List 14: データ テンプレートを指定する場合 (XAML) データ テンプレートは <ContentControl> 要素の ContentTemplate プロパティに指定する Figure 8: List 13 と List 14 の表示結果 データ テンプレートの自動適用 データ テンプレートは もちろんリソース化して複数の <ContentControl> 要素間で共有できる また コントロール テンプレートで自動適用ができたように ( 具体的には <ControlTemplate> 要素に TargetType プロパティを設定 ) データ テンプレートも <DataTemplate> 要素の DataType プロパティを設定することで 指定した型に対してデータ テンプレートを自動適用できる 例えば List 14 の例は List 15 のように書き換えられる 省略 <Grid xmlns:exp="clr-namespace:system.linq.expressions;assembly=system.core"> <Grid.Resources> <DataTemplate DataType="x:Type exp:binaryexpression"> <StackPanel Orientation="Horizontal"> -30-

31 <TextBlock Text="Binding NodeType" Background="LightBlue" /> <TextBlock Text=": " /> <TextBlock Text="Binding Left" Background="LightBlue" /> <TextBlock Text=", " /> <TextBlock Text="Binding Right" Background="LightBlue" /> </StackPanel> </DataTemplate> </Grid.Resources> <ContentControl Content="Binding Body" /> </Grid> 省略 List 15: データ テンプレートの自動適用の例 (XAML) データ テンプレートをリソース化して <DataTemplate> 要素の DataType プロパティを設定することで 指定した型に対して一括でデータ テンプレートを自動適用できる この例では System.Core アセンブリに含まれる BinaryExpression 型 (System.Linq.Expressions 名前空間 ) のデータすべてに対して <DataTemplate> 要素で定義されたデータ テンプレートが自動的に適用される データ テンプレートの自動適用は 型の混在する階層的なデータに対してテンプレートを適用したいときに特に重宝することだろう 例えば 式ツリーは その名前どおり 階層的なデータ構造をしているので List 15 に例示した BinaryExpression クラスなら Left プロパティや Right プロパティも式ツリーになっていて BinaryExpression クラスをはじめとするさまざまなクラスが格納されている このとき Left プロパティなどを再度 <ContentControl 要素 > の Content プロパティにバインディングしておけば 階層的なテンプレート適用が行われる 式ツリーを構成するさまざまな型すべてに対してデータ テンプレートを適用できるリソース ファイルを 下記の URL からダウンロードできるようにしたので 興味がある場合にはダウンロードしてみていただきたい リソース ファイルの利用方法は 本連載第 4 回の 外部リソースの取り込み の項を参照してほしい 式ツリー表示用のリソース ファイル (ExpressionTreeTemplates.xaml) のダウンロード ( 右クリックして [ 対象をファイルに保存 ]) このデータ テンプレート一式を使って -31-

32 (int x, int y) => (x + 3) * (y - 1) というラムダ式から得られた式ツリー全体を表示すると Figure 9 のようになる Figure 9: 階層的なデータに対してデータ テンプレートを適用した例 ここまでの実行例では Binding Body としてラムダ式の本体部分の式ツリー (=Body プロパティ ) のみを表示していたが この例では Binding (= Binding Path=. とも記述可能 ) としてラムダ式全体 (= バインディング ソース ) の式ツリーを表示している ItemsControl クラス : コレクションに対するデータ テンプレートの適用 データ ソースがコレクションの場合 ItemsControl クラス (Sytem.Windows.Control 名前空間 ) の ItemsSource プロパティにデータを ItemTemplate プロパティにデータ テンプレートを渡すことによってデータ バインディングを行う ItemTemplate プロパティに指定したテンプレートは コレクションの要素 1 つ 1 つに対して適用される また この場合にも ( 単一のデータの場合と同様に ) データ テンプレートの自動適用は有効である List 12 と同じデータ ( x + y という式ツリー ) に対して List 16 に示すような XAML コードを書くと Figure 10 のような表示結果が得られる ソース プロパティとして指定している Parameters プロパティには ラムダ式の引数リストの部分 (= x, y の部分 ) が格納されていて これは ParameterExpression 型のリストになっている 各要素には 型に基づいてテンプレートが自動適用される 省略 <Grid xmlns:exp="clr-namespace:system.linq.expressions;assembly=system.core"> -32-

33 <Grid.Resources> <DataTemplate DataType="x:Type exp:parameterexpression"> <StackPanel Orientation="Horizontal"> <TextBlock Text="Binding Name" Background="LightPink" /> <TextBlock Text=":" /> <TextBlock Text="Binding Type.Name" Background="LightPink" /> </StackPanel> </DataTemplate> </Grid.Resources> <ItemsControl ItemsSource="Binding Parameters" /> </Grid> 省略 List 16: コレクションに対するデータ テンプレートの適用 (XAML) データは <ItemsControl> 要素の ItemSource プロパティに指定する データ テンプレートは 個々の <ItemsControl> 要素の ItemTemplate プロパティに指定することもできるが この例では データ テンプレートをリソース化して <DataTemplate> 要素の DataType プロパティを設定することで 指定した型に対して一括でデータ テンプレートを自動的に適用している Figure 10: List 16 の表示結果 コラム C# コード内でデータ バインディング 参考までに データ バインディングを C# コードだけで記述する方法に触れておこう <TextBlock Text="Binding Path=X, Mode=OneWay" /> という記述と同様のデータ バインディングを C# コード内で行うためには List 17 に示すような記述が必要になる Binding クラス (System.Windows.Data 名前空間 ) のインスタンスを作成し FrameworkElement クラスの SetBinding メソッドを通じて データ バインディングを行う var source = new X = 10, Y = 20 ; var binding = new Binding(); -33-

34 binding.source = source; binding.mode = BindingMode.OneWay; binding.path = new PropertyPath("X"); var target = new TextBlock(); target.setbinding(textblock.textproperty, binding); List 17: C# コードのみでデータ バインディングを行う例 第 6 回 コマンド と MVVM パターン を理解する 前回に引き続き ビューとモデルの疎結合を実現するための仕組みの 1 つである コマンド という機能について説明する また データ バインディングとコマンドの仕組みを使った WPF アプリケーションのアーキテクチャ パターンである MVVM(Model-View-ViewModel) パターン についても紹介する GUI アプリケーションに対する要件 前回も行ったように WPF のコマンドの仕組みを説明する前に コマンドに関連する GUI アプリケーションに対する要件を整理してみよう 意味論的なイベント処理 ( コマンド ) 一般的な GUI アプリケーションでは マウスのクリックやキーボードからの入力など 実操作レベルのイベントをそのまま処理するよりも コピー や 貼り付け などの意味論的なレイヤを通してイベント処理したい場合も多い このような考え方は Figure 1 に示すように 意味論的には同じ操作を 複数の入力操作で実行したい場合に有効である WPF では この意味論的なイベントを コマンド (command) と呼んでいる -34-

35 Figure 1: 生の入力イベントと意味論的なイベント コマンドの実行可否 コマンドは常に実行できるわけではなく モデル (= 扱っているデータ ) の状態によっては実行できない状態になることがある 例えば ユーザーから入力されたデータが想定した形式でなければデータベースへの反映をさせないとか ネットワーク切断時にはオンライン処理を実行できなくするといった場合である ここで コマンドが実行できない状態にある場合 ( そのコマンドに対応する ) ビュー上のメニューやボタンを押せなくしたいという要求がある 実際 例えば多くのアプリケーションでは コピー可能なテキストを選択していないときにはメニューの コピー の項目がグレー表示され 押せなくなっている 注意が必要なのは コマンドの実行可否はモデルの状態に応じて随時変化し これに応じてボタンやメニューなどの有効 / 無効を切り替えなければならないということである 従って モデルの持つ 1 つのデータを複数のビューから参照するための仕組み (= データ バインディング ) と同様に データが変化したことを ( 各ビューに ) 通知する仕組み (= コマンド ) が必要となる WPF では 前回説明したデータ バインディングと 今回説明していくコマンドという仕組みを用いることで ビューとモデルの疎結合を保ちつつ これらの要件を満たすことができる コマンド WPF では 上記の要件でも説明したような 以下の 2 つの機能を提供する コマンド (command) という仕組みを持っている クリックやキー入力などの実操作レベルのイベントではなく コピーや貼り付けなどの意味的なイベント処理を行う モデルの状態に応じてボタンを押せなくするなどして コマンドを実行の可否を切り替える コマンドの実体 実装上の話をすると WPF のコマンドの実体は ICommand インターフェイス (System.Windows.Input 名前空間 ) を実装したクラスである ICommand インターフェイスは以下のようなメンバを持っている Execute メソッド : コマンドを実行する CanExecute メソッド : コマンドが実行可能な状態にあるかどうかを判定する CanExecuteChanged イベント : INotifyPropertyChanged インターフェイスの PropertyChanged イベントと同様 コマンド実行の可否が変化したことを通知するためのイベント コマンドには主に 2 通りの使い方があり 1 つはデータ バインディングを用いてビューの外部からコマンドを与える方法で もう 1 つは ルーティング コマンド と呼ばれる方法である -35-

36 次のページでは この 2 つの方法の内容をそれぞれ説明する データ バインディングでコマンド処理 前回説明したように WPF にはデータ バインディングという仕組みがあり ビューの外部から表示したいデータを与えることができる ( 外部から与えるデータは 後述する ビューモデル (ViewModel) というものになる場合が多い ) この仕組みを用いることで Figure 2 に示すように 表示したいデータだけでなく コマンドを外部から与えることも可能である こうすることで ビュー内にはデータも処理も書く必要がなくなり 一般にテストが難しくなりがちなビューを極力小さくすることができる Figure 2: データ バインディングでビューの外部からコマンドを与える この方法におけるコマンドの利用手順は以下のようになる ICommand インターフェイスを実装したクラスを作る (= コマンドの実装 ) 外部から与えるデータ (= ビューモデル ) により 実装したコマンドをプロパティとして公開する 公開したプロパティを <Button> 要素や <MenuItem> 要素などの Command プロパティにデータ バインディングする 例えば [OK] ボタンを押すとメッセージボックスを表示するだけの単純なウィンドウを作成するには List 1 のような書き方をする XAML <Window x:class="atmarkit06.commandwindow" xmlns=" xmlns:x=" Title=" コマンド ( ビューモデル )" Height="80" Width="100"> <Grid> <Button Content="OK" Command="Binding OkCommand" /> -36-

37 </Grid> </Window> Visual Basic Class CommandWindow Sub New() InitializeComponent() Me.DataContext = New CommandWindowViewModel() End Sub End Class ' 外部から与えるデータ (= ビューモデル ) Public Class CommandWindowViewModel Class OkCommandImpl : Implements ICommand Public Function CanExecute(ByVal parameter As Object) As Boolean Implements ICommand.CanExecute Return True End Function Public Event CanExecuteChanged(ByVal sender As Object, ByVal e As EventArgs) Implements ICommand.CanExecuteChanged Public Sub Execute(ByVal parameter As Object) Implements ICommand.Execute MessageBox.Show(" コマンドが実行されました ") End Sub End Class Private newokcommand As ICommand Public Property OkCommand As ICommand Get Return newokcommand End Get Private Set(ByVal value As ICommand) newokcommand = value End Set End Property Sub New() Me.OkCommand = New OkCommandImpl() End Sub End Class Visual C# -37-

38 using System; using System.Windows; using System.Windows.Input; namespace atmarkit06 public partial class CommandWindow : Window public CommandWindow() InitializeComponent(); this.datacontext = new CommandWindowViewModel(); // 外部から与えるデータ (= ビューモデル ) public class CommandWindowViewModel class OkCommandImpl : ICommand public bool CanExecute(object parameter) return true; public event EventHandler CanExecuteChanged; public void Execute(object parameter) MessageBox.Show(" コマンドが実行されました "); public ICommand OkCommand get; private set; public CommandWindowViewModel() this.okcommand = new OkCommandImpl(); List 1: データ バインディングを使ったコマンド処理 この書き方が 後述する MVVM パターンでのコマンド処理の基本となる ICommand インターフェイスの実装については 本稿後半の MVVM パターンの項で再度説明を行う ルーティング コマンドを使ったコマンド処理 もう 1 つはルーティング コマンド (routed command) を使う方法である WPF 標準で用意された ICommand インターフェイスの 1 実装として RoutedCommand クラスというものがあり このクラスを継承した派生クラスのオブジェクト (= これが ルーティング コマンドの実体 ) を用いる ちなみに WPF では標準で RoutedCommand クラスを継承した RoutedUICommand クラスが用意されている -38-

39 Figure 3 に示すように RoutedCommand クラスでは Execute メソッドが呼び出された際に Executed などのルーティング イベントを発生させる このルーティング イベントをツリー構造の上位の UI 要素で拾って処理することになる Figure 3: ルーティング コマンド RoutedCommand クラスは 以下のようなルーティング イベントを発生させる ( トンネル イベントでは 要素ツリーのルートからイベント発生源となる要素に向かって 要素ツリーを掘り進むようにイベント ハンドラが呼び出される トンネル イベントの名前には原則として Preview というプレフィックスが付く バブル イベントでは イベント発生源となる要素からルートに向かって 要素ツリーをたどりながら 浮かび上がるようにイベント ハンドラが呼び出される ) PreveiwExecuted: Excute メソッドが呼ばれたときに発生するトンネル イベント Executed: Excute メソッドが呼ばれたときに発生するバブル イベント PreviewCanExecute: CanExcute メソッドが呼ばれたときに発生するトンネル イベント CanExecute: CanExcute メソッドが呼ばれたときに発生するバブル イベント ルーティング コマンドを使う方法でのコマンドの利用手順は以下のようになる RoutedCommand クラスを継承してルーティング コマンドを自作するか あるいは WPF 標準で用意されたルーティング コマンド (=RoutedUICommand クラス ) をそのまま利用する 自作したルーティング コマンドは ( 任意のクラスで ) 静的プロパティなどで公開しておく 一方 WPF 標準のルーティング コマンドは何もしなくてもよい ( 詳しくは後述するが ApplicationCommands クラスなどで静的プロパティとして公開されているため ) ルーティング コマンドの実体 (= 公開済みの静的プロパティの値 ) を <Button> 要素や <MenuItem> 要素などの Command プロパティに与える ルーティング コマンド自作した場合 x:static マークアップ拡張 *1 などを用いて値に与える ( 本稿ではこの手法は割愛 ) 標準のルーティング コマンドは 例えば Command="ApplicationCommands.Copy" *2 などと書くだけで利用可能 ( 詳細後述 ) コマンド処理を行う上位の UI 要素で CommandBindings プロパティを設定 その中の <CommandBinding> 要素の Command プロパティにルーティング コマンドの実体 (= 公開済みの -39-

40 静的プロパティの値 ) を指定し Executed プロパティなどにイベント ハンドラを登録する (= コマンド バインディング ) *1 x:static マークアップ拡張とは マークアップ拡張構文の一種で < オブジェクト名プロパティ名 ="x:static プレフィックス : 静的な型 / オブジェクトの名前. 静的なメンバの名前 ".../> のような記述により 何らかクラスの静的プロパティを XAML コードで使用するためのもの *2 この例で指定している ApplicationCommands.Copy 静的プロパティからは RoutedUICommand オブジェクトが得られる 詳細後述 WPF 標準のルーティング コマンド (= いずれも RoutedUICommand オブジェクト ) は 利用目的別にいくつかのクラスにまとめられ (= コマンド ライブラリ ) 各クラスの静的プロパティとして公開されている 具体的には以下のようなクラスがある ( EditingCommands クラスのみ System.Windows.Documents 名前空間 それ以外はいずれも System.Windows.Input 名前空間 ) ApplicationCommands: ファイルを開く 保存 ウィンドウを閉じるなど NavigationCommands: ブラウザの戻る ホームを開く 前項 / 次項を開くなど ComponentCommands: リスト アイテムやセルの移動 スクロール フォーカスの移動など EditingCommands: テキスト編集用のコマンド MediaCommands: メディアの再生 停止 次のトラックへ移動など 例えば List 1 と同様のもの (=[OK] ボタンを押すとメッセージボックスを表示するプログラム ) を作成するには List 2 のような書き方をする このコードでは 標準のルーティング コマンドを利用している XAML <Window x:class="atmarkit06.routedcommandwindow" xmlns=" xmlns:x=" Title=" コマンド ( ルーティング コマンド )" Height="80" Width="100"> <Window.CommandBindings> <CommandBinding Command="Properties" Executed="CommandBinding_Executed" /> </Window.CommandBindings> <Grid> <Button Content="OK" Command="Properties" /> </Grid> </Window> Visual Basic Class RoutedCommandWindow Private Sub CommandBinding_Executed(ByVal sender As Object, ByVal e As ExecutedRoutedEventArgs) MessageBox.Show(" コマンドが実行されました ") -40-

41 End Sub End Class Visual C# using System.Windows; using System.Windows.Input; namespace atmarkit06 public partial class RoutedCommandWindow : Window public RoutedCommandWindow() InitializeComponent(); private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e) MessageBox.Show(" コマンドが実行されました "); List 2: ルーティング コマンドを用いたコマンド処理 ちなみにルーティング コマンドを自作する場合は public static RoutedCommand MyRoutedCmd = new RoutedCommand(); // C# の場合 Public Shared MyRoutedCmd As New RoutedCommand() ' VB の場合 のような 1 行を C#/VB コードの任意の public クラス内 ( 例えば 上記の RoutedCommandWindow クラス内 ) に記述して XAML コードの Command プロパティに x:static マークアップ拡張で x:static custom:routedcommandwindow.myroutedcmd のように記述すればよい なお この cusutom という XML 名前空間に対応する xmlns:custom 属性は あらかじめ XAML コードのルートにある <Window> 要素に追記しておく必要がある 例えば下記のようなコードになる xmlns:custom="clr-namespace:atmarkit06" Command プロパティに設定している Properties という値は 正確には ApplicationCommands クラス (System.Windows.Input 名前空間 ) の Properties 静的プロパティを指す 従って 本来なら x:static ApplicationCommands.Properties と記述するべきだが WPF 標準のルーティング コマンド群の場合 通常 Command 属性への指定では ApplicationCommands. などを省略して Command="Copy" と簡潔に記述できる なお この ApplicationCommands.Properties 静的プロパティより得られるルーティング コマンドは -41-

42 本来 プロパティ ウィンドウを開く という処理を表すものだが 説明の簡素化のために ここではメッセージボックスの表示で代用している ルーティング コマンドは ユーザー コントロールを自作する場合や コントロール テンプレートを利用する場合などに特に有効である 連載第 4 回でスクロールバーへのコントロール テンプレートの適用の例を挙げたが テンプレート側でルーティング コマンドを使って Executed などのルーティング イベントを発生させ コントロール側の <CommandBindings> 要素でそれを拾ってイベント (= コマンド ) 処理してもらうというような使い方が可能だ コマンド ソース データ バインディングを使うにしろ ルーティング コマンドを使うにしろ まずはコマンドの発生源 (= コマンド ソース ) の設定が必要だ WPF では コマンド ソースを実装するための ICommandSource インターフェイス (System.Windows.Input 名前空間 ) があり コマンド ソースとなる UI 要素を作る場合には このインターフェイスを実装する ICommandSource インターフェイスは以下のようなメンバを持っている Command プロパティ : 発生させたいコマンドを設定する CommandParameter プロパティ : ICommand インターフェイスの Execute メソッドや CanExecute メソッドの引数として渡されるパラメータを設定する CommandTarget プロパティ : コマンドの実行対象を設定する 例えば Paste コマンドが実行される際に どの UI 要素に対して貼り付け処理を行うかなどを指定する ルーティング イベントでのみ利用可能 WPF 標準で提供されているコマンド ソースには 大きく分けてコントロールとインプット バインディングの 2 種類ある コントロール <Button> 要素や <MenuItem> 要素など 一部のコントロールは ICommandSource インターフェイスを実装している このため ボタンをクリックした際などに Command プロパティで与えたコマンドが実行される ( 例 : 前述の List 1: データ バインディングを使ったコマンド処理 や List 2: ルーティング コマンドを用いたコマンド処理 で示した <Button> 要素の Command プロパティを参照 ) ただし 残念ながら 標準では左ボタンのクリック イベントを拾ってコマンド実行する以外のことができない 例えば ダブルクリックや 中ボタンのクリックでコマンドを実行したい場合もあるかもしれないが このような場合 後述するインプット バインディングを用いることになる ( 厳密には ビヘイビアを使う方法もあるが Expression Blend SDK が必要になるなど 入門の範囲を超えてしまうため 本連載では割愛する ) インプット バインディング コントロールのような 目に見えるコマンド ソース以外に キーボード ショートカットや特殊なマウス ジェスチャーなどの入力系のイベントを拾ってコマンド実行するためのインプット バインディングという仕組みがある -42-

43 UIElement クラス (System.Windows 名前空間 )(=WPF の UI 要素の共通基底クラス ) には InputBindings というプロパティがあり これに <KeyBinding> 要素 もしくは <MouseBinding> 要素を与えることでインプット バインディングを行う 例えば [Alt]+[Shift]+[X] キーを押す や [Ctrl] キーを押しながらマウス ホイールを回す などの特殊な操作に対してコマンドを実行するには List 3 に示すような XAML コードを記述する <Window x:class="atmarkit06.commandsourcewindow" xmlns=" xmlns:x=" Title=" インプット バインディング " Height="300" Width="300"> <Window.InputBindings> <KeyBinding Gesture="Alt+Shift+X" Command="Binding OkCommand" /> <MouseBinding Gesture="Ctrl+WheelClick" Command="Binding OkCommand" /> </Window.InputBindings> <Grid> </Grid> </Window> List 3: インプット バインディング (XAML) List 1 と同様のビューモデルをデータ バインディングすれば [Alt]+[Shift]+[X] キーを押す [ Ctrl] キーを押しながらマウス ホイールを回す という操作を行った際にメッセージボックスが表示される <KeyBinding> 要素の Gesture プロパティには 1 つ以上の修飾キーと 1 つのキーを定義する KeyGesture クラス (System.Windows.Input 名前空間 ) の値を単一の文字列で設定する 文字列からのコンバータが働くので List 3 に示す Alt+Shift+X などのような略記が可能になっている 同様に <MouseBinding> 要素の Gesture プロパティには ( 必要であれば 1 つ以上の修飾キーと )1 つのマウス操作を定義する MouseGesture クラス (System.Windows.Input 名前空間 ) の値を単一の文字列で List 3 に示す Ctrl+WheelClick などのように略記で設定する ちなみに 標準で用意されている (ApplicationCommands クラスなどの静的プロパティとして公開されている ) ルーティング コマンドに対しては 最初からインプット バインディングが設定されていて 何も記述しなくても Ctrl+S で Save コマンド Ctrl+C で Copy コマンドなどというように ルーティング コマンドが実行される 前回と今回を通したここまでの説明を踏まえて 次のページでは MVVM パターンについて解説する MVVM パターン これまでの説明でも用語として少し出てきたが WPF による GUI アプリケーション開発では ( 特に -43-

44 アプリケーション規模が大きい場合 ) Figure 4 に示すような ビューとモデルの間に ビューモデル と呼ばれるものを挟んだ 3 階層アーキテクチャで作成する場合が多い このようなアーキテクチャ パターンを MVVM(Model-View-ViewModel) パターン と呼ぶ Figure 4: ビュー ビューモデル モデルの 3 階層構造 ビューモデルからビューへの表示変更の通知は INotifyPropertyChanged インターフェイスの実装を通じて行われる 逆に ビューからビューモデルへのコマンド ( 状態変更 ) の通知は ICommand インターフェイスの実装を通じて行われる MVVM パターンは 有名な MVC(Model-View-Controller) パターンと同種のアーキテクチャ パターンで WPF の強力なデータ バインディング機能の利用を前提とした亜種だと考えればいいだろう ビューモデルの役割 MVVM パターンにおいて ビューモデルは以下の 2 つの役割を担う モデルを WPF 向けにラッピング ビューから状態を分離 モデルをラッピング 前回で説明したように WPF のデータ バインディングの機能を最大限享受するためには データ ソースが INotifyPropertyChanged インターフェイス (System.ComponentModel 名前空間 ) を実装している必要がある また 前節での説明のとおり ユーザーの操作に応じて何らかの処理を行う場合には ICommand インターフェイスを実装したコマンドを利用することになる さらに ユーザーからの入力に不整合がないかなどのデータ検証を行うためには IDataErrorInfo インターフェイス (System.ComponentModel 名前空間 ) を実装する これらのインターフェイスは WPF 専用というわけではなく 実際 Windows フォームや ASP.NET でも使われているものではあるが それでもすべてのモデルがこれらを実装しているわけではない そこで モデルをラッピングして INotifyPropertyChanged インターフェイスによるプロパティ値の変更通知などを実装するのが ビューモデルの役割の 1 つである -44-

45 ビューから状態を分離 一般に GUI 部分 (= ビュー ) のテストは手間がかかりがちなため ビューは極力小さくとどめたいという要求があり ビューから状態を分離する ということがよく行われる 状態の分離 といわれてもピンと来ないかもしれないが WPF のコマンドの仕組みを前提として説明するなら 以下のような 2 つのテストをそれぞれ別のクラスに分離したいということである このボタンを押したらこのコマンドが実行されるはず というテスト (= ビューに残す部分 ) このコマンドが実行されたらデータ ソースのここがこう変化するはず (= 状態変化 ) というテスト (= ビューモデルに追いやる部分 ) この分離が不明瞭 ( ふめいりょう ) な場合 考え得るすべての状態 ( 仮に m 個とする ) のときに 考え得るすべての入力 ( 仮に n 個 ) を与えてテストを行う必要が生じ テスト ケースが膨大な数 (m n 個 ) となる これに対して 明確に分離すれば テスト ケースを少なく (m+n 個 ) 抑えられる もともと ビューとモデルの疎結合 という考え方も ビューを小さくとどめるための工夫の 1 つである しかし モデルはさまざまなビューでの利用が ( 場合によってはコンソール アプリケーションでも ) 可能な形で作られるもので ある特定のビュー上でしか必要のないような状態を記録しておく場所ではない そこで このような特定のビュー上でのみ利用する状態を保持する場所として ビューモデルを利用することになる データ バインディングによる疎結合 ビューとモデルの疎結合 や ビューからの状態の分離 が可能なのも Figure 5 に示すように INotifyPropertyChanged インターフェイスや ICommand インターフェイスなどの標準的なインターフェイスを介した通知機構のおかげである Figure 5: ビューからの状態の分離 ビューとモデルの疎結合 この図の View は ビューとなる WPF ウィンドウなどを指している また State は ビューモデルとなるオブジェクトを指している -45-

46 このようなインターフェイスを介した通知機構を利用する際 最後に残る問題は コマンドの登録や PropertyChanged イベントに対するハンドラの登録を誰がどこで行うかという部分である (Figure 5 中の赤い枠線内のような処理 ) WPF のデータ バインディングでは この手の登録作業を View.DataContext = ViewModel; などと書くだけで フレームワークの内部ですべて自動的に行ってくれるため 非常に手軽になっている ( ここでいう View とはビューとなる WPF ウィンドウなどのことで ViewModel とはビューモデルとなるオブジェクトのこと 詳しくは前回のデータ バインディングに関する説明を参照されたい ) ビューモデルの作成方法 それでは INotifyPropertyChanged ICommand IDataErrorInfo などのインターフェイスの実装方法について見ていこう なお ビューモデルとビューをデータ バインディングするための前提条件として ビュー側のコンストラクタに Visual Basic Me.DataContext = New ViewModel() Visual C# this.datacontext = new ViewModel(); というコードが用意され XAML コードに <StackPanel> <TextBox Text="Binding X, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True" ToolTip="Binding RelativeSource =x:static RelativeSource.Self, Path=(Validation.Errors)[0].ErrorContent"/> <Button Content="OK" Command="Binding OkCommand" /> </StackPanel> というコードがあらかじめ記述されているものとする ( このコードにある Binding マークアップ拡張 の書き方については 第 5 回の記事を参照してほしい ) INotifyPropertyChanged インターフェイスの実装 INotifyPropertyChanged インターフェイスは PropertyChanged イベントを持っていて プロパティの値が変化した際には このイベントを起こすことになる 例えば int/integer 型の X というプロパティを実装するなら List 4 に示すようなコードを書く Visual Basic Imports System.ComponentModel Public Class ViewModel : Implements INotifyPropertyChanged Private _x As Integer -46-

47 Public Property X As Integer Get Return _x End Get Set(ByVal value As Integer) If _x <> value Then _x = value RaisePropertyChanged("X") End If End Set End Property Public Event PropertyChanged(ByVal sender As Object, ByVal e As PropertyChangedEventArgs) Implements INotifyPropertyChanged.PropertyChanged Protected Sub RaisePropertyChanged(ByVal propertyname As String) RaiseEvent PropertyChanged( _ Me, New PropertyChangedEventArgs(propertyName)) End Sub End Class Visual C# using System.ComponentModel; public class ViewModel : INotifyPropertyChanged private int _x; public int X get return _x; set if (_x!= value) _x = value; RaisePropertyChanged("X"); public event PropertyChangedEventHandler PropertyChanged; protected void RaisePropertyChanged(string propertyname) var d = PropertyChanged; if (d!= null) d(this, new PropertyChangedEventArgs(propertyName)); -47-

48 List 4: INotifyPropertyChanged インターフェイスを用いたプロパティ値の変更通知の実装 また X+Y の値を返すような X プロパティに依存する別のプロパティ ( 今回の例では Sum というプロパティ ) を作る場合には List 5 に示すようなコードを書く ( 追記した個所は太字で示している ) Visual Basic 省略 Public ReadOnly Property Sum As Integer Get Return X + Y End Get End Property ' ToDo: ここに Y プロパティも実装する必要がある Private _x As Integer Public Property X As Integer Get Return _x End Get Set(ByVal value As Integer) If _x <> value Then _x = value RaisePropertyChanged("X") RaisePropertyChanged("Sum") End If End Set End Property 省略 Visual C# 省略 public int Sum get return X + Y; // ToDo: ここに Y プロパティも実装する必要がある private int _x; public int X get return _x; set if (_x!= value) -48-

49 _x = value; RaisePropertyChanged("X"); RaisePropertyChanged("Sum"); 省略 List 5: ほかのプロパティに依存するプロパティの値の変更通知 ICommand インターフェイス (= コマンド ) の実装 前述のとおり コマンドの仕組みを使う際には ICommand インターフェイスを実装したクラスを作成する ただ コマンド 1 つ 1 つに対して毎度クラスを作成するのは手間がかかるので ヘルパー的なクラスを作っておく場合が多い 特によく使われるパターンは List 6 に示すような Execute メソッドや CanExecute メソッド内ではデリゲートを呼び出すだけというクラスである (DelegateCommand という名前を付けることが多い ) Visual Basic Public Class DelegateCommand : Implements ICommand Public Property ExecuteHandler As Action(Of String) Public Property CanExecuteHandler As Func(Of Object, Boolean) #Region "ICommand メンバー " Public Function CanExecute(ByVal parameter As Object) As Boolean Implements ICommand.CanExecute Dim d = CanExecuteHandler Return IIf(d = Nothing, True, d(parameter)) End Function Public Sub Execute(ByVal parameter As Object) Implements ICommand.Execute Dim d = ExecuteHandler If d <> Nothing Then d(parameter) End If End Sub Public Event CanExecuteChanged(ByVal sender As Object, ByVal e As EventArgs) Implements ICommand.CanExecuteChanged Public Sub RaiseCanExecuteChanged() RaiseEvent CanExecuteChanged(Me, Nothing) End Sub #End Region -49-

50 End Class Visual C# using System; using System.Windows.Input; public class DelegateCommand : ICommand public Action<object> ExecuteHandler get; set; public Func<object, bool> CanExecuteHandler get; set; #region ICommand メンバー public bool CanExecute(object parameter) var d = CanExecuteHandler; return d == null? true : d(parameter); public void Execute(object parameter) var d = ExecuteHandler; if (d!= null) d(parameter); public event EventHandler CanExecuteChanged; public void RaiseCanExecuteChanged() var d = CanExecuteChanged; if (d!= null) d(this, null); #endregion List 6: DelegateCommand クラス この DelegateCommand クラスを用いて X プロパティの値が正のときだけ実行ができ 実行時にはメッセージボックスを表示する というようなコマンドを実装するなら ビューモデルのコードは List 7 のようになる (List 4 から追記した個所は太字で示している List 5 で追記した部分は削除した ) Visual Basic Imports System.ComponentModel Public Class ViewModel : Implements INotifyPropertyChanged -50-

51 Private _x As Integer Public Property X As Integer Get Return _x End Get Set(ByVal value As Integer) If _x <> value Then _x = value RaisePropertyChanged("X") CType(OkCommand, DelegateCommand). RaiseCanExecuteChanged() End If End Set End Property Private Sub OkCommandExecute(ByVal parameter As Object) MessageBox.Show(" コマンドが実行されました ") End Sub Private Function OkCommandCanExecute(ByVal parameter As Object) As Boolean Return X > 0 End Function Private _okcommand As ICommand Public ReadOnly Property OkCommand As ICommand Get If _okcommand Is Nothing Then _okcommand = New DelegateCommand With.ExecuteHandler = _ AddressOf OkCommandExecute,.CanExecuteHandler = _ AddressOf OkCommandCanExecute End If Return _okcommand End Get End Property Public Event PropertyChanged(ByVal sender As Object, ByVal e As PropertyChangedEventArgs) Implements INotifyPropertyChanged.PropertyChanged Protected Sub RaisePropertyChanged(ByVal propertyname As String) RaiseEvent PropertyChanged( _ Me, New PropertyChangedEventArgs(propertyName)) End Sub -51-

52 End Class Visual C# using System.ComponentModel; using System.Windows; using System.Windows.Input; public class ViewModel : INotifyPropertyChanged private int _x; public int X get return _x; set if (_x!= value) _x = value; RaisePropertyChanged("X"); ((DelegateCommand)OkCommand). RaiseCanExecuteChanged(); private void OkCommandExecute(object parameter) MessageBox.Show(" コマンドが実行されました "); private bool OkCommandCanExecute(object parameter) return X > 0; private ICommand _okcommand; public ICommand OkCommand get if (_okcommand == null) _okcommand = new DelegateCommand ExecuteHandler = OkCommandExecute, CanExecuteHandler = OkCommandCanExecute, ; return _okcommand; -52-

53 public event PropertyChangedEventHandler PropertyChanged; protected void RaisePropertyChanged(string propertyname) var d = PropertyChanged; if (d!= null) d(this, new PropertyChangedEventArgs(propertyName)); List 7: DelegateCommand クラスの利用例 IDataErrorInfo インターフェイス (= データ検証 ) の実装 前回説明したように データ バインディング時に ValidatesOnDataErrors プロパティに True を設定することで (Binding マークアップ拡張は前述のコード例を参照 ) IDataErrorInfo インターフェイス (System.ComponentModel 名前空間 ) を用いたデータ検証が有効になる 例えば List 8 のようなコードを書くことで X プロパティの値が正の数でないときに検証エラーを表示できる Visual Basic Imports System.ComponentModel Public Class ViewModel : Implements INotifyPropertyChanged, IDataErrorInfo ' X プロパティや PropertyChanged イベントの実装は List 4 と同じ 省略 #Region "IDataErrorInfo メンバー " Public ReadOnly Property [Error] As String Implements IDataErrorInfo.Error Get Return IIf(X <= 0, "X は正の数 ", Nothing) End Get End Property Default Public ReadOnly Property Item(ByVal columnname As String) As String Implements IDataErrorInfo.Item Get Select Case columnname Case "X" Return IIf(X <= 0, "X は正の数 ", Nothing) End Select Return Nothing End Get -53-

54 End Property #End Region End Class Visual C# public class ViewModel : INotifyPropertyChanged, IDataErrorInfo // X プロパティや PropertyChanged イベントの実装は List 4 と同じ 省略 #region IDataErrorInfo メンバー public string Error get return X <= 0? "X は正の数 " : null; public string this[string columnname] get switch(columnname) case "X": return X <= 0? "X は正の数 " : null; return null; #endregion, List 8: IDataErrorInfo インターフェイスの実装例 ただし この例のような インデクサの中で switch(columnname) / Select Case columnname で分岐するような実装では プロパティの数が増えるにつれてコードの管理が大変になる そこで 例えば以下のリンク先の参考ページのように データ検証属性 ( = System.ComponentModel.DataAnnotations 名前空間にある Required 属性などを用いて実装を簡素化するというような方法がよく用いられる ( リンク先の参考ページにおけるサンプル コードは Silverlight 4 向けで そのままでは WPF で利用できないが ほぼ同様の実装が可能である ) かずきの Blog@Hatena:Silverlight 4 のデータ検証 汎用的な INotifyDataErrorInfo の実装 ちなみに ここで出てきた INotifyDataErrorInfo インターフェイスは Silverlight にだけ存在し データ検証状態が変化したことを通知する仕組みが入ったインターフェイスである (IDataErrorInfo インターフェイスには通知の仕組みがなく プロパティをまたいだ検証がしづらくなっている ) -54-

55 コラム MVVM パターンを活用する前に知っておきたい補足情報 自動生成 List 4~8 のコードを見てのとおり ビューモデルには定型的なコードが大量に並ぶことになるため 実装が非常に面倒という問題がある そこで コードの自動生成などに頼り 開発を効率化するための手段がいくつか提供されている 参考 : T4(Text Template Transformation Toolkit) テンプレートの利用 : T4 Template で ViewModel を生成する コード スニペットの利用 : コードスニペットを使った INotifyPropertyChanged の実装 DynamicObject の利用 : M-V-VM パターン用動的プロキシ デザイン時属性 WPF のデータ バインディングの仕組みは リフレクションなどを使って動的に動作しているため ビルド時にスペルミスなどの人的エラーに悩まされたり Visual Studio の人気機能の 1 つであるコード補完が働かなかったりといった問題もある そこで Visual Studio 2010 や Expression Blend では デザイン時限定で適用され ビルド結果の実行可能ファイル中には情報が残らない d:datacontext というプロパティ (= デザイン時 DataContext) を使って データ バインディングの入力補助を行う仕組みを備えている 参考 : MSDN: チュートリアル : Silverlight Designer でのサンプルデータの使用 (Visual Studio 2010 では WPF と Silverlight のデザイナーが共通化されているため WPF の場合でもそのまま利用可能 ) 今回で 長かった XAML/WPF の基礎や仕組みについて一通り説明が終わった 次回からは個々の UI 要素について説明していく -55-

XAML Do-It-Yourself 第 3 回ベントとトリガー XML Do-It-Yourself 第 3 回目は ベント処理とトリガーについて学習します Windows フォームゕプリケーションでは たとえば ボタンが押された というベントに対応する処理 ( ベントハンドラー ) を記述する

XAML Do-It-Yourself 第 3 回ベントとトリガー XML Do-It-Yourself 第 3 回目は ベント処理とトリガーについて学習します Windows フォームゕプリケーションでは たとえば ボタンが押された というベントに対応する処理 ( ベントハンドラー ) を記述する XAML Do-It-Yourself シリーズ 第 3 回ベントとトリガー -1- XAML Do-It-Yourself 第 3 回ベントとトリガー XML Do-It-Yourself 第 3 回目は ベント処理とトリガーについて学習します Windows フォームゕプリケーションでは たとえば ボタンが押された というベントに対応する処理 ( ベントハンドラー ) を記述することで ゕプリケーションのユーザーンターフェスを実現していました

More information

WPF Bindingの威力

WPF Bindingの威力 WPF Binding の威力 えムナウ ( 児玉宏之 ) Microsoft MVP for Visual- Developer C# 2005/01-2007/12 アジェンダ はじめに Bindingの概要 データソース データ変換 データ検証 はじめに Windows Presentation Foundation (WPF) データバインディングは アプリケーションがデータを提供し 柔軟な

More information

わさわさとWPF

わさわさとWPF わさわさと WPF ソースコードと要点で学ぶ WPF の活用 わさわさとは WPF を使用して開発された Wassr( 和製ミニブログ ) クラゕント WPF の表現によりデスクトップゕプリながら HTML に引けを取らない表示を実現 VS2008 のみで開発したためコントロールのデザン等は弄っていない 動作には Windows XP 以降が必要 http://hcm.wankuma.com/wasawasa.htm

More information

WPF アプリケーションの 多言語切替

WPF アプリケーションの 多言語切替 WPF アプリケーションの 多言語切替 YK S o f t w a r e 2015 年 6 月 2 日 @twyujiro15 プロフィール 加藤裕次郎 本職は製造業の開発業務 - 2009 年 4 月に入社 1982.03.03 生まれ ( うお座 ) 左利き ( お箸は右 ) twitter : @twyujiro15 プログラミング経験 Excel VBA MATLAB MATX C VC++

More information

C#の基本

C#の基本 C# の基本 ~ 開発環境の使い方 ~ C# とは プログラミング言語のひとつであり C C++ Java 等に並ぶ代表的な言語の一つである 容易に GUI( グラフィックやボタンとの連携ができる ) プログラミングが可能である メモリ管理等の煩雑な操作が必要なく 比較的初心者向きの言語である C# の利点 C C++ に比べて メモリ管理が必要ない GUIが作りやすい Javaに比べて コードの制限が少ない

More information

XAML Do-It-Yourself シリーズ 第 7 回テンプレート -1-

XAML Do-It-Yourself シリーズ 第 7 回テンプレート -1- XAML Do-It-Yourself シリーズ 第 7 回テンプレート -1- XAML Do-It-Yourself 第 7 回テンプレート XAML Do-It-Yourself 第 7 回は テンプレートについて学習します テンプレートを使うと コントロ ールの外観を拡張できます 今回は テンプレートを使って 以下の内容を学習します テンプレートによるコントロールのカスタマズ バンデゖングデータの表示に使用するテンプレート

More information

WPF アプリケーションの 多言語切替

WPF アプリケーションの 多言語切替 元に戻す操作の実装 YK S o f t w a r e 2015 年 8 月 7 日 @twyujiro15 プロフィール 加藤裕次郎 本職は製造業の開発業務 - 2009 年 4 月に入社 1982.03.03 生まれ ( うお座 ) 左利き ( お箸は右 ) twitter : @twyujiro15 プログラミング経験 Excel VBA MATLAB MATX C VC++ (Windows

More information

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション 本セッションは 赤間さんのセッションで時間的な都合から紹介しきれなかった WPF と Silverlight の検証機能を解説し グレープシテゖが現在開発中の InputMan for WPF で提供する検証機能をご紹介するセッションです 本セッションはそれぞれの最新バージョンである WPF 3.5 SP1 と Silverlight 3 を前提にした内容となっています 2 検証の基本エラー表示の方法

More information

WPFの初歩の初歩

WPFの初歩の初歩 WPF の初歩の初歩 うつせみ ( 虚蝉 ) 本日のお品書き XAML について XAML って? (Extensible Application Markup Language) XML をベースとしたマークアップ言語 デザインとロジックが分離デザイナとコーダーの分業が可能に XAML を見てみよう どちらも同じものです (Button) XAML C#

More information

DEMO1 まずはやってみよう アクティビティをダブルクリック 作成 - プロジェクト C# => Workflow CodeActivity をぽとぺ シーケンシャルと ステートマシン それぞれのコ ンソールアプリ あとライブラリがある びっくりマークは足りていないあかし プロパティをみると判別で

DEMO1 まずはやってみよう アクティビティをダブルクリック 作成 - プロジェクト C# => Workflow CodeActivity をぽとぺ シーケンシャルと ステートマシン それぞれのコ ンソールアプリ あとライブラリがある びっくりマークは足りていないあかし プロパティをみると判別で DEMO1 まずはやってみよう アクティビティをダブルクリック 作成 - プロジェクト C# => Workflow CodeActivity をぽとぺ シーケンシャルと ステートマシン それぞれのコ ンソールアプリ あとライブラリがある びっくりマークは足りていないあかし プロパティをみると判別できます こんなコードを追加 string str = Console.ReadLine(); int

More information

Prog2_12th

Prog2_12th 2018 年 12 月 13 日 ( 木 ) 実施クラスの継承オブジェクト指向プログラミングの基本的な属性として, 親クラスのメンバを再利用, 拡張, または変更する子クラスを定義することが出来る メンバの再利用を継承と呼び, 継承元となるクラスを基底クラスと呼ぶ また, 基底クラスのメンバを継承するクラスを, 派生クラスと呼ぶ なお, メンバの中でコンストラクタは継承されない C# 言語では,Java

More information

Carousel for WPF/Silverlight

Carousel for WPF/Silverlight 2018.04.10 更新 グレープシティ株式会社 目次 製品の概要 2 ComponentOne for / のヘルプ 2 主な特長 3 クイックスタート 4 手順 1: アプリケーションの作成 4-5 手順 2: アプリケーションへのコンテンツの追加 5-8 手順 3: アプリケーションの実行 8 Carousel for / の使い方 9 C1CarouselPanel の使用 9-10 カルーセルのカスタマイズ

More information

SharpShooter Reports.WPF 基本的な使い方 Last modified on: November 15, 2012 本ドキュメント内のスクリーンショットは英語表記ですが SharpShooter Reports JP( 日本語版 ) では日本語で表示されます

SharpShooter Reports.WPF 基本的な使い方 Last modified on: November 15, 2012 本ドキュメント内のスクリーンショットは英語表記ですが SharpShooter Reports JP( 日本語版 ) では日本語で表示されます SharpShooter Reports.WPF 基本的な使い方 Last modified on: November 15, 2012 本ドキュメント内のスクリーンショットは英語表記ですが SharpShooter Reports JP( 日本語版 ) では日本語で表示されます 目次 はじめに... 3 システムの必要条件... 3 ライセンス認証... 3 アクティベーション... 5 開発...

More information

グラフィックス 目次

グラフィックス 目次 WPF チュートリアル WPF デザイナーに依るサイズ変更可能なアプリケーションの作成 Grid コンテナーコントロールと共に GridSplitter コントロールを使用する事に依り 実行時にユーザーに依ってサイズを変更出来るウィンドウレイアウトを作成出来る 例えば 領域に分割されて居る UI を持つアプリケーションで ユーザーが分割線をドラッグする事に依り より多くの内容を見る必要が有る領域を大きくする事が出来る

More information

Sparkline for WPF

Sparkline for WPF 2018.04.11 更新 グレープシティ株式会社 目次 Sparkline for WPF の概要 2 WPF Edition のヘルプ 2 主要な機能 2 クイックスタート :Sparkline for WPF 2-4 機能 4 軸 4 日付軸 4-5 データ連結 5 スパークラインのタイプ 5-7 スパークラインタイプの設定 7 マーカー 7-9 マーカーの色のカスタマイズ 9-10 タスク別ヘルプ

More information

XAML Do-It-Yourself シリーズ 第 1 回 XAML 概要 -1-

XAML Do-It-Yourself シリーズ 第 1 回 XAML 概要 -1- XAML Do-It-Yourself シリーズ 第 1 回 XAML 概要 -1- XAML Do-It-Yourself 第 1 回 XAML 概要 はじめに - XAML Do-It-Yourself について 本 XAML Do-It-Yourself シリーズでは 13 回にわたって XAML (Extensible Application Markup Language) の基礎を学習していきます

More information

WPF/Silverlightのスタイルやアニメーション

WPF/Silverlightのスタイルやアニメーション WPF/Silverlight でのスタイルやアニメーション 池原大然 インフラジスティックス ジャパン 自己紹介 池原大然 ( いけはらだいぜん ) or ねり インフラジスティックス ジャパン所属 Silverlight, WPF が大好きです http://blogs.jp.infragistics.com/blogs/dikehara/ はじめに 今回は Silverlight 3 を中心としたスタイル

More information

Prog2_15th

Prog2_15th 2019 年 7 月 25 日 ( 木 ) 実施メニューメニューバーとコンテクストメニュー Visual C# では, メニューはコントロールの一つとして扱われ, フォームアプリケーションの上部に配置されるメニューバーと, コントロール上でマウスを右クリックすると表示されるコンテクストメニューとに対応している これ等は選択するとメニューアイテムのリストが表示されるプルダウンメニューと呼ばれる形式に従う

More information

XAML の勉強上要! WPF アプリケーションは作れます

XAML の勉強上要!  WPF アプリケーションは作れます ゕジェンダ 自己紹介 はじめに 簡単なゕプリケーションを作ってみる Binding 概要 Linq to SQL とのバンデゖング ゕニメーション 3D グラフゖック まとめ 自己紹介 福井県越前市 ( 武生市 ) 出身 東京都杉並区在住 ソフトウェゕ業務歴 28 年 フリ- 技術者歴 20 年以上 でも 永遠の28 歳 4Bitワンチップからワークステーションまでのソフトを開発 開発言語も多種多様

More information

XAML Do-It-Yourself シリーズ 第 8 回ゕニメーション -1-

XAML Do-It-Yourself シリーズ 第 8 回ゕニメーション -1- XAML Do-It-Yourself シリーズ 第 8 回ゕニメーション -1- XAML Do-It-Yourself 第 8 回ゕニメーション XAML Do-It-Yourself 第 8 回は ゕニメーションについて学習します XAML (WPF) が提供するゕニメ ーション機能は 時間の経過と共に コントロールのプロパテゖを変化させる機能です コントロールに 含まれるほとんどのプロパテゖに対して

More information

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション グレープシテゖ株式会社 八巻雄哉 .NET Framework 3.0 で追加された Windows ゕプリケーションのための GUI サブシステム 2 Windows GDI User Direct3D OpenGL DirectShow 2D 2D 2D 3D ビデオ ビットマップ フォント GUI 3 Windows WPF 2D 3D ビデオ ビットマップフォント GUI 4 うちの業務ゕプリでは

More information

Prog2_4th

Prog2_4th 2018 年 10 月 18 日 ( 木 ) 実施 イベントハンドライベントハンドラとは Windows フォーム上のコントロールに対して クリックされた とか 文字列を変更された とかいったイベントを行った際に, それを受け取って処理を行うメソッドをイベントハンドラと呼ぶ 本日の課題第 3 回の授業では, フォームデザイナーで該当するコントロールをダブルクリックして, コードエディタに表示されたイベントハンドラの処理を記述したが,

More information

.NETプログラマー早期育成ドリル ~VB編 付録 文法早見表~

.NETプログラマー早期育成ドリル ~VB編 付録 文法早見表~ .NET プログラマー早期育成ドリル VB 編 付録文法早見表 本資料は UUM01W:.NET プログラマー早期育成ドリル VB 編コードリーディング もしくは UUM02W:.NET プログラマー早期育成ドリル VB 編コードライティング を ご購入頂いた方にのみ提供される資料です 資料内容の転載はご遠慮下さい VB プログラミング文法早見表 < 基本文法 > 名前空間の定義 Namespace

More information

Chart3D for WPF/Silverlight

Chart3D for WPF/Silverlight 2018.04.10 更新 グレープシティ株式会社 目次 製品の概要 2 ComponentOne for WPF/Silverlight のヘルプ 2 主な特長 3 クイックスタート 4 手順 1: プロジェクトへのコントロールの追加 4-5 手順 2: データの追加 5-6 手順 3: グラフの外観の変更 6-7 手順 4: 凡例の追加 7 手順 5: プロジェクトの実行 7 XAML クイックリファレンス

More information

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション VBA (Visual BASIC for Applications) で Body Mass Index 判定プログラムを作る ユーザーフォームを用いたプログラムの作成 Graphic User Interface ( GUI ) の利用法 構造化プログラムの作成 複雑なプログラムを 関数に分割して作る方法 VBA(Visual BASIC for Applications) のテキストは たくさんあります

More information

Visual Studio Do-It-Yourself 第 9 回ユーザーコントロール 第 6 回のリソースから第 8 回のテンプレートで さまざまな方法でコントロールをカスタマズできるこ とを学びました 今回のテーマであるユーザーコントロールは 既存の一つのコントロールをカスタマ ズするのではな

Visual Studio Do-It-Yourself 第 9 回ユーザーコントロール 第 6 回のリソースから第 8 回のテンプレートで さまざまな方法でコントロールをカスタマズできるこ とを学びました 今回のテーマであるユーザーコントロールは 既存の一つのコントロールをカスタマ ズするのではな Visual Studio Do-It-Yourself シリーズ 第 9 回ユーザーコントロール -1- Visual Studio Do-It-Yourself 第 9 回ユーザーコントロール 第 6 回のリソースから第 8 回のテンプレートで さまざまな方法でコントロールをカスタマズできるこ とを学びました 今回のテーマであるユーザーコントロールは 既存の一つのコントロールをカスタマ ズするのではなく

More information

WPF アプリケーションの 多言語切替

WPF アプリケーションの 多言語切替 パスワード認証 YK S o f t w a r e 2015 年 8 月 3 日 @twyujiro15 プロフィール 加藤裕次郎 本職は製造業の開発業務 - 2009 年 4 月に入社 1982.03.03 生まれ ( うお座 ) 左利き ( お箸は右 ) twitter : @twyujiro15 プログラミング経験 Excel VBA MATLAB MATX C VC++ (Windows

More information

Microsoft PowerPoint - Windows Presentation Foundation (WPF) 3.5 の新機能

Microsoft PowerPoint - Windows Presentation Foundation (WPF) 3.5 の新機能 WPF 3.5 の新機能 川 裕幸 UX エバンジェリスト デベロッパー & プラットフォーム統括本部 マイクロソフト株式会社 WPF 3.5?.NET Framework 3.5 に含まれる WPF SP1 + 新しいアセンブリ (System.Core.dll など ) Linq は System.Core.dll に含まれる.NET Framework 3.0 SP1 に含まれる WPF Windows

More information

FileExplorer for ASP.NET Web Forms

FileExplorer for ASP.NET Web Forms FileExplorer for ASP.NET Web Forms 2018.04.12 更新 グレープシティ株式会社 目次 製品の概要 2 ComponentOne for ASP.NET Web Formsのヘルプ 2 ビジュアル要素 3 クイックスタート : フォルダパスの追加 4-5 エクスプローラーの機能 6 複数ファイルの選択 6-7 フォルダの作成と管理 7 ファイル操作の無効化 7

More information

MISAO with WPF

MISAO with WPF System.AddIn を利用した アプリケーション拡張 - アドインの開発 - JZ5( 松江祐輔 )@ わんくま http://katamari.jp http://katamari.wankuma.com 2008/9/13 What s System.AddIn System.AddIn 名前空間 Visual Studio Orcus から利用可能 アプリケーションに拡張機能を提 供 なんかいろいろ特長が?

More information

ボタンイベントアプリイベント処理を含むアプリとして, ボタンをもち, ボタンを押すと文字列を表示するアプリを作る. このアプリは,HelloWorld アプリを改造して作成するため, アプリ作成の途中からの手順を示す. 1. ボタンの設置 (1) レイアウトにボタンを追加するパレットの フォーム ウ

ボタンイベントアプリイベント処理を含むアプリとして, ボタンをもち, ボタンを押すと文字列を表示するアプリを作る. このアプリは,HelloWorld アプリを改造して作成するため, アプリ作成の途中からの手順を示す. 1. ボタンの設置 (1) レイアウトにボタンを追加するパレットの フォーム ウ ボタンイベントアプリイベント処理を含むアプリとして, ボタンをもち, ボタンを押すと文字列を表示するアプリを作る. このアプリは,HelloWorld アプリを改造して作成するため, アプリ作成の途中からの手順を示す. 1. ボタンの設置 (1) レイアウトにボタンを追加するパレットの フォーム ウィジェット からボタンのアイコンをドラッグして, ワークスペースにドロップする. 図 1 ボタンの追加

More information

Microsoft Word - VB.doc

Microsoft Word - VB.doc 第 1 章 初めてのプログラミング 本章では カウントアップというボタンを押すと表示されている値が1ずつ増加し カウントダウンというボタンを押すと表示されている値が1ずつ減少する簡単な機能のプログラムを作り これを通して Visual Basic.NET によるプログラム開発の概要を学んでいきます 1.1 起動とプロジェクトの新規作成 Visual Studio.NET の起動とプロジェクトの新規作成の方法を

More information

プログラミング基礎I(再)

プログラミング基礎I(再) 山元進 クラスとは クラスの宣言 オブジェクトの作成 クラスのメンバー フィールド 変数 配列 メソッド メソッドとは メソッドの引数 戻り値 変数の型を拡張したもの 例えば車のデータベース 車のメーカー 車種 登録番号などのデータ データベースの操作 ( 新規データのボタンなど ) プログラムで使う部品の仕様書 そのクラスのオブジェクトを作ると初めて部品になる 継承 などの仕組みにより カスタマイズが安全

More information

Microsoft PowerPoint - hmoriya-REMIX2006-Print-New [互換モード]

Microsoft PowerPoint - hmoriya-REMIX2006-Print-New [互換モード] using System; using System.Windows; public class App { [STAThread] public static void Main() { Application app = new Application(); Window win = Window(); win.content = Hello WPF Code ; app.run(win); }

More information

Format text with styles

Format text with styles Word 入門 Word はワープロおよびレイアウトのための効果的なアプリケーションです 最も効果的に使用するには 最初にその基礎を理解する必要があります このチュートリアルでは すべての文書で使用する作業と機能をいくつか紹介します 開始する前に... 1 1. 新しい空白の文書を作成する... 2 2. Word のユーザーインターフェイスについて... 4 3. 文書内を移動する... 5 4.

More information

グラフィックトレーニング 概要.NET のグラフィック描画は どんなことができるのでしょうか? グラフィックオブジェクトやグラフィック環境 概念を理解するためには クラスを使って馴れることが近道です 本 書に記載されているコードをカットアンドペーストして 一つ一つの機能を体験してください 前提 グラ

グラフィックトレーニング 概要.NET のグラフィック描画は どんなことができるのでしょうか? グラフィックオブジェクトやグラフィック環境 概念を理解するためには クラスを使って馴れることが近道です 本 書に記載されているコードをカットアンドペーストして 一つ一つの機能を体験してください 前提 グラ C# & VB 1 グラフィックトレーニング 概要.NET のグラフィック描画は どんなことができるのでしょうか? グラフィックオブジェクトやグラフィック環境 概念を理解するためには クラスを使って馴れることが近道です 本 書に記載されているコードをカットアンドペーストして 一つ一つの機能を体験してください 前提 グラフィックを行うためには Visual Studio の基本操作や C# または VB

More information

Prog2_2nd

Prog2_2nd 2018 年 10 月 4 日 ( 木 ) 実施 C# プログラムの基礎 基本構造 1) クラス Visual C# のプログラムの基本単位をクラスと呼ぶ Windows フォームアプリケーションを作 成する際, プロジェクトを作成すると生成されるファイルのうち,Form1.cs を例にとれば, その クラス名は Form1 である クラスは class キーワードを用いて宣言する Form1.cs

More information

目次 はじめに... 3 システムの必要条件... 4 ライセンス認証... 4 アクティベーション... 6 開発... 7 手順 1. アプリケーションの作成... 7 手順 2. データソースの作成と代入... 7 手順 3. テンプレートの作成 手順 4. レポートビューアの追加

目次 はじめに... 3 システムの必要条件... 4 ライセンス認証... 4 アクティベーション... 6 開発... 7 手順 1. アプリケーションの作成... 7 手順 2. データソースの作成と代入... 7 手順 3. テンプレートの作成 手順 4. レポートビューアの追加 SharpShooter Reports.Win 基本的な使い方 Last modified on: November 15, 2012 本ドキュメント内のスクリーンショットは英語表記ですが SharpShooter Reports JP( 日本語版 ) では日本語で表示されま す 目次 はじめに... 3 システムの必要条件... 4 ライセンス認証... 4 アクティベーション... 6 開発...

More information

intra-mart Accel Platform — IM-Repository拡張プログラミングガイド   初版  

intra-mart Accel Platform — IM-Repository拡張プログラミングガイド   初版   Copyright 2018 NTT DATA INTRAMART CORPORATION 1 Top 目次 1. 改訂情報 2. はじめに 2.1. 本書の目的 2.2. 対象読者 2.3. サンプルコードについて 2.4. 本書の構成 3. 辞書項目 API 3.1. 最新バージョン 3.1.1. 最新バージョンの辞書を取得する 3.2. 辞書項目 3.2.1. 辞書項目を取得する 3.2.2.

More information

Visual Studio と.NET Framework 概要 Runtime Libraries Languag es Tool.NET Visual Studio 概要 http://download.microsoft.com/download/c/7/1/c710b336-1979-4522-921b-590edf63426b/vs2010_guidebook_pdf.zip 1.

More information

目次 はじめに... 3 システムの必要条件... 3 サンプルアプリケーションの作成... 3 手順 手順 手順 手順 手順 手順 終わりに... 23

目次 はじめに... 3 システムの必要条件... 3 サンプルアプリケーションの作成... 3 手順 手順 手順 手順 手順 手順 終わりに... 23 SharpShooter Reports.Silverlight 基本的な使い方 Last modified on: August 16, 2012 本ドキュメント内のスクリーンショットは英語表記ですが SharpShooter Reports JP( 日本語版 ) では日本語で表示されます 目次 はじめに... 3 システムの必要条件... 3 サンプルアプリケーションの作成... 3 手順 1...

More information

図 2 Excel スプレッドシートの世界 のウィンドウ 図 3 Visual Basic の世界 のウィンドウ 図 3 の VBA ウィンドウは 図 2 の Excel ウィンドウのメニューの ツール をクリックし 開か れるプルダウンメニューで マクロ /Visual Basic Editor

図 2 Excel スプレッドシートの世界 のウィンドウ 図 3 Visual Basic の世界 のウィンドウ 図 3 の VBA ウィンドウは 図 2 の Excel ウィンドウのメニューの ツール をクリックし 開か れるプルダウンメニューで マクロ /Visual Basic Editor Excel マクロ -Visual Basic の基本 - 1.Excel ファイルの構成 Excel ファイルは 右図のように 構成されている 一般に Excel と言えば 右図で Excel スプレッドシートの世界 と名付けた部分 すなわち Excel を起動したときに表示されるスプレッドシート (1ページの場合もあり 数ページの場合もある ) のみであるように思われている Excel ファイルには

More information

第21章 表計算

第21章 表計算 第 3 部 第 3 章 Web サイトの作成 3.3.1 WEB ページ作成ソフト Dreamweaver の基本操作 Web ページは HTML CSS という言語で作成されており これらは一般的なテキストエディタで作成できるのが特徴ですが その入 力 編集は時に煩雑なものです そこで それらの入力 編集作業など Web ページの作成を補助するソフトウェアである Dreamweaver の使い方について解説していきます

More information

グラフィックス 目次

グラフィックス 目次 WPF チュートリアル Microsoft Expression Blend を使用してボタンを作成する 此のチュートリアルでは WPF のカスタマイズされたボタンを Microsoft Expression Blend を使用して作成する手順に付いて説明する Microsoft Expression Blend の具体的な動作は Extensible Application Markup Language(XAML)

More information

Delphi/400でFlash動画の実装

Delphi/400でFlash動画の実装 吉原泰介 株式会社ミガロ. RAD 事業部技術支援課顧客サポート Delphi/400 で Flash 動画の実装 YouTube プレイヤーの作成 Flash の機能を ActiveX を利用して Delphi/400 アプリケーションへ組み込む方法を紹介する Flash と ActiveX コントロール ActiveX コントロールの取り込み YouTube プレイヤーの実装 まとめ 略歴 1978

More information

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード] 第 3 回 Java 基本技術講義 クラス構造と生成 33 クラスの概念 前回の基本文法でも少し出てきたが, オブジェクト指向プログラミングは という概念をうまく活用した手法である. C 言語で言う関数に似ている オブジェクト指向プログラミングはこれら状態と振る舞いを持つオブジェクトの概念をソフトウェア開発の中に適用し 様々な機能を実現する クラス= = いろんなプログラムで使いまわせる 34 クラスの概念

More information

intra-mart Accel Platform — IM-共通マスタ スマートフォン拡張プログラミングガイド   初版  

intra-mart Accel Platform — IM-共通マスタ スマートフォン拡張プログラミングガイド   初版   Copyright 2012 NTT DATA INTRAMART CORPORATION 1 Top 目次 1. 改訂情報 2. IM- 共通マスタの拡張について 2.1. 前提となる知識 2.1.1. Plugin Manager 2.2. 表記について 3. 汎用検索画面の拡張 3.1. 動作の概要 3.1.1. 汎用検索画面タブの動作概要 3.2. 実装の詳細 3.2.1. 汎用検索画面タブの実装

More information

XAML Do-It-Yourself シリーズ 第 12 回 3D グラフィックス -1-

XAML Do-It-Yourself シリーズ 第 12 回 3D グラフィックス -1- XAML Do-It-Yourself シリーズ 第 12 回 3D グラフィックス -1- XAML Do-It-Yourself 第 12 回 3D グラフィックス XAML Do-It-Yourself 第 12 回は 3D グラフィックスについて学習します これまでアプリケーション で 3D グラフィックスを扱うには DirectX のコンポーネントを使用する必要がありましたが WPF (XAML)

More information

C#の基本2 ~プログラムの制御構造~

C#の基本2 ~プログラムの制御構造~ C# の基本 2 ~ プログラムの制御構造 ~ 今回学ぶ事 プログラムの制御構造としての単岐選択処理 (If 文 ) 前判定繰り返し処理(for 文 ) について説明を行う また 整数型 (int 型 ) 等の組み込み型や配列型についても解説を行う 今回作るプログラム 入れた文字の平均 分散 標準偏差を表示するプログラム このプログラムでは calc ボタンを押すと計算を行う (value は整数に限る

More information

目次 概要... 2 フォームレイアウトデザイナー機能の設定... 3 設定したフォームレイアウトデザイナーの確認...14 その他スタイルの設定...15 フォームレイアウトデザイナーをエクスポート...17 フォームレイアウトデザイナーをインポート...18 インポート時の制限事項...19 リ

目次 概要... 2 フォームレイアウトデザイナー機能の設定... 3 設定したフォームレイアウトデザイナーの確認...14 その他スタイルの設定...15 フォームレイアウトデザイナーをエクスポート...17 フォームレイアウトデザイナーをインポート...18 インポート時の制限事項...19 リ [SP 改 ] フォームレイアウトデザイナー FOR SHAREPOINT 2013 ユーザーマニュアル 1.0 版 2014 年 04 月 11 日 株式会社アンク 目次 概要... 2 フォームレイアウトデザイナー機能の設定... 3 設定したフォームレイアウトデザイナーの確認...14 その他スタイルの設定...15 フォームレイアウトデザイナーをエクスポート...17 フォームレイアウトデザイナーをインポート...18

More information

Microsoft Word -

Microsoft Word - Visual Basic 2005 Express Edition 起動とプロジェクトの新規作成方法 1.1 起動とプロジェクトの新規作成 Visual Basic の起動とプロジェクトの新規作成の方法を Visual Basic 2005 Express Edition で説明します なお バージョンやエディションが異なる場合は 操作方法が若干違います 本節の起動とプロジェクトの新規作成の部分については

More information

V8.1新規機能紹介記事

V8.1新規機能紹介記事 WebOTX V8.1 新規機能 EJB 3.0 WebOTX V8.1より Java EE 5(Java Platform, Enterprise Edition 5) に対応しました これによりいろいろな機能追加が行われていますが 特に大きな変更であるEJB 3.0 対応についてご紹介いたします なお WebOTX V7で対応したEJB 2.1についてもWebOTX V8.1で引き続き利用することが可能です

More information

目次 1 はじめに WPF とは データバインディング バインディングモード コンバータ コマンド コレクションのデータバインディング 依存関係プロパティ...

目次 1 はじめに WPF とは データバインディング バインディングモード コンバータ コマンド コレクションのデータバインディング 依存関係プロパティ... WPF 入門ノート 2017 年 3 月 12 日 (日) 小寺 広志 目次 1 はじめに... 1 2 WPF とは... 1 2.1. 3 4 5 データバインディング... 3 3.1. バインディングモード... 6 3.2. コンバータ... 7 3.3. コマンド... 10 3.4. コレクションのデータバインディング... 11 依存関係プロパティ... 12 4.1. 埋め込み...

More information

XAML Do-It-Yourself シリーズ 第 11 回 2D グラフゖックス -1-

XAML Do-It-Yourself シリーズ 第 11 回 2D グラフゖックス -1- XAML Do-It-Yourself シリーズ 第 11 回 2D グラフゖックス -1- XAML Do-It-Yourself 第 11 回 2D グラフゖックス XAML Do-It-Yourself 第 11 回は 2D グラフゖックスについて学習します XAML を使って作成する WPF ゕプリケーションでは 従来の Windows フォームゕプリケーションと 比較して 2D および 3D

More information

1/2

1/2 札幌学院大学社会情報学部課題用テキスト (2) 1 札幌学院大学社会情報学部課題用テキスト HTML の基礎知識 (2) 1 画像の表示 HP に画像を表示させてみる まず HTML 文書と同じフォルダ内 に JPEG ファイル ( 拡張子.jpg ) を 1 個準備する ( 画像の作り方 サイズの調べ方はこのプリントの最後を参照 ) この画像を読みこんで表示するためのタグは以下の通りである 画像ファイル名と

More information

すると メインメニューと呼ばれる DC さくらのメインウィンドウ部が表示されます ( 下の画面がスクリーンシ ョットです ) メインメニューは ウィンドウ右上の ボタンを押すと閉じます リスト内のアイテムは ダウンロードのタスクを表します ダウンロード状況を把握できます メニュー項目やボタンの説明は

すると メインメニューと呼ばれる DC さくらのメインウィンドウ部が表示されます ( 下の画面がスクリーンシ ョットです ) メインメニューは ウィンドウ右上の ボタンを押すと閉じます リスト内のアイテムは ダウンロードのタスクを表します ダウンロード状況を把握できます メニュー項目やボタンの説明は DC さくらの画面構成 DC さくらが起動している間は デスクトップ右下のタスクトレイに DC さくらのアイコンが表示されます この DC さくらのアイコンを右クリックしてください ( 下の図はスクリーンショットです ) この青色のアイコンが DC さくらのアイコンです DCさくらのアイコンを右クリックすると 以下の図のような操作メニューが表示されます メニュー項目には 操作を行うための各コマンドが配置されております

More information

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション 基本 Java プログラミング演習 第 13 回 担当 : 植村 今後の予定 7/15 第 13 回 今回 7/22 第 14 回 小テスト ( クラス ) 7/29 第 15 回 総まとめテスト レポート提出 期末テストの時間割に Java のテストの欄がありますが無視してください 再テストはまた別途連絡いたします 2 CHAPTER 11 はじめてのクラス前回の復習 クラスクラスを構成する要素

More information

INFRAGISTICS WPF 18.1 サービスリリースノート 2019 年 4 月 Infragistics WPF で実現する高度な BI ときれいなデスクトップ UI Infragistics WPF コントロールは 広範な機能を提供し 最小限の開発工数でアプリケーションの作成を可能にしま

INFRAGISTICS WPF 18.1 サービスリリースノート 2019 年 4 月 Infragistics WPF で実現する高度な BI ときれいなデスクトップ UI Infragistics WPF コントロールは 広範な機能を提供し 最小限の開発工数でアプリケーションの作成を可能にしま WPF 18.1 サービスリリースノート 2019 年 4 月 Infragistics WPF で実現する高度な BI ときれいなデスクトップ UI Infragistics WPF コントロールは 広範な機能を提供し 最小限の開発工数でアプリケーションの作成を可能にします 高速パフォーマンスなジェスチャ ー / タッチサポート 動的なテーマなど 便利な機能をすぐにアプリケーションに追加できます

More information

デザインパターン第一章「生成《

デザインパターン第一章「生成《 変化に強いプログラミング ~ デザインパターン第一章 生成 ~ 梅林 ( 高田明宏 )@ わんくま同盟 デザインパターンとは何か (1) デザインパターンの定義 ソフトウェア開発におけるデザインパターンとは 過去のソフトウェア設計者が発見し編み出した設計ノウハウを蓄積し 名前をつけ 再利用しやすいように特定の規約に従ってカタログ化したもの (Wikipedia) 参考書籍 オブジェクト指向における再利用のためのデザインパターン

More information

HP Primeバーチャル電卓

HP Primeバーチャル電卓 HP Prime バーチャル電卓 Windows は 米国 Microsoft Corporation およびその関連会社の米国およびその他の国における商標または登録商標です 本書の内容は 将来予告なしに変更されることがあります HP 製品およびサービスに関する保証は 当該製品およびサービスに付属の保証規定に明示的に記載されているものに限られます 本書のいかなる内容も 当該保証に新たに保証を追加するものではありません

More information

JavaScript 演習 2 1

JavaScript 演習 2 1 JavaScript 演習 2 1 本日の内容 演習問題 1の解答例 前回の続き document.getelementbyid 関数 演習問題 4 イベント処理 基本的なフォーム テキストボックスの入力値の取得 演習問題 5 演習問題 1 prompt メソッドと document.write メソッドを用いて, ユーザから入力されたテキストと文字の色に応じて, 表示内容を変化させる JavaScript

More information

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション 1 01 Visual C# 2010 を使ってみよう BMI 計算プログラム 1 Visual Studio 2010 の起動 1 2 画面左下 タスクバーの左端にある スタートボタン をクリック 表示されたメニューにある すべてのプログラム をクリック 2 1 3 4 メニューから Microsoft Visual Studio 2010 のフォルダを探して これをクリック フォルダが展開されて

More information

Microsoft PowerPoint - chap10_OOP.ppt

Microsoft PowerPoint - chap10_OOP.ppt プログラミング講義 Chapter 10: オブジェクト指向プログラミング (Object-Oriented Programming=OOP) の入り口の入り口の入り口 秋山英三 F1027 1 例 : 部屋のデータを扱う // Test.java の内容 public class Test { public static void main(string[] args) { double length1,

More information

内容 1 はじめに インストールの手順 起動の手順 Enterprise Architect のプロジェクトファイルを開く 内容を参照する プロジェクトブラウザを利用する ダイアグラムを開く 便利な機能.

内容 1 はじめに インストールの手順 起動の手順 Enterprise Architect のプロジェクトファイルを開く 内容を参照する プロジェクトブラウザを利用する ダイアグラムを開く 便利な機能. Viewer manual by SparxSystems Japan Enterprise Architect 読み込み専用版 (Viewer) 利用マニュアル 内容 1 はじめに...3 2 インストールの手順...3 3 起動の手順...6 4 Enterprise Architect のプロジェクトファイルを開く...7 5 内容を参照する...8 5.1 プロジェクトブラウザを利用する...8

More information

intra-mart Accel Platform

intra-mart Accel Platform intra-mart Accel Platform IM- 共通マスタスマートフォン拡張プログラミングガイド 2012/10/01 初版 変更年月日 2012/10/01 初版 > 変更内容 目次 > 1 IM- 共通マスタの拡張について...2 1.1 前提となる知識...2 1.1.1 Plugin Manager...2 1.2 表記について...2 2 汎用検索画面の拡張...3

More information

グラフィックス 目次

グラフィックス 目次 WPF チュートリアル WPF の概要 此のチュートリアルでは 殆どの Windows Presentation Foundation(WPF) アプリケーションに共通の要素を含む WPF アプリケーションの開発の概要に付いて説明する 此の様な共通の要素には Extensible Application Markup Language(() マークアップ 分離コード アプリケーション定義 コントロール

More information

Microsoft Word - ModelAnalys操作マニュアル_

Microsoft Word - ModelAnalys操作マニュアル_ モデル分析アドイン操作マニュアル Ver.0.5.0 205/0/05 株式会社グローバルアシスト 目次 概要... 3. ツール概要... 3.2 対象... 3 2 インストールと設定... 4 2. モデル分析アドインのインストール... 4 2.2 モデル分析アドイン画面の起動... 6 3 モデル分析機能... 7 3. 要求分析機能... 7 3.. ID について... 0 3.2 要求ツリー抽出機能...

More information

改訂履歴 日付バージョン記載ページ改訂内容 V2.1 - 初版を発行しました V3.1 P5 ドキュメントラベルが新規追加された事を追記 P7 P8 新しくなったラベルのツリー表示説明を追記 新しくなったラベルの作成 削除操作を追記 P9 ラベルのグループ

改訂履歴 日付バージョン記載ページ改訂内容 V2.1 - 初版を発行しました V3.1 P5 ドキュメントラベルが新規追加された事を追記 P7 P8 新しくなったラベルのツリー表示説明を追記 新しくなったラベルの作成 削除操作を追記 P9 ラベルのグループ 改訂履歴 日付バージョン記載ページ改訂内容 2012-10-23 V2.1 - 初版を発行しました 2013-08-30 V3.1 P5 ドキュメントラベルが新規追加された事を追記 P7 P8 新しくなったラベルのツリー表示説明を追記 新しくなったラベルの作成 削除操作を追記 P9 ラベルのグループ別参照権限設定操作を追記 2015-06-16 V5.0 P27 クラスター入力値を帳票備考にコピーする説明を追記

More information

1 開発ツールのインストール 最初に JDK をインストールし 次に IDE をインストールする という手順になります 1. JDK のインストール JDK のダウンロードとインストール JDK は次の URL でオラクル社のウェブページからダウンロードします

1 開発ツールのインストール 最初に JDK をインストールし 次に IDE をインストールする という手順になります 1. JDK のインストール JDK のダウンロードとインストール JDK は次の URL でオラクル社のウェブページからダウンロードします 1 開発ツールのインストール 最初に JDK をインストールし 次に IDE をインストールする という手順になります 1. JDK のインストール JDK のダウンロードとインストール JDK は次の URL でオラクル社のウェブページからダウンロードします http://www.oracle.com/technetwork/java/javase/downloads/index.html なお

More information

Visual Basic 資料 電脳梁山泊烏賊塾 コレクション初期化子 コレクション初期化子 初めに.NET 版の Visual Basic では 其れ迄の Visual Basic 6.0 とは異なり 下記の例の様に変数宣言の構文に 初期値を代入する式が書ける様に成った 其の際 1 の様に単一の値

Visual Basic 資料 電脳梁山泊烏賊塾 コレクション初期化子 コレクション初期化子 初めに.NET 版の Visual Basic では 其れ迄の Visual Basic 6.0 とは異なり 下記の例の様に変数宣言の構文に 初期値を代入する式が書ける様に成った 其の際 1 の様に単一の値 コレクション初期化子 コレクション初期化子 初めに.NET 版の Visual Basic では 其れ迄の Visual Basic 6.0 とは異なり 下記の例の様に変数宣言の構文に 初期値を代入する式が書ける様に成った 其の際 1 の様に単一の値 ( 此処では 10) を代入する丈でなく 2 の配列変数の宣言の様に ブレース { } の中にカンマ区切りで初期値のリストを記述し 配列の各要素に初期値を代入出来る様に成った

More information

Javaプログラムの実行手順

Javaプログラムの実行手順 戻り値のあるメソッド メソッドには 処理に使用する値を引数として渡すことができました 呼び出し 側からメソッドに値を渡すだけでなく 逆にメソッドで処理を行った結果の値を 呼び出し側で受け取ることもできます メソッドから戻してもらう値のことを もどりち戻り値といいます ( 図 5-4) 図 5-4. 戻り値を返すメソッドのイメージ 戻り値を受け取ることによって ある計算を行った結果や 処理に成功したか失

More information

ガイダンス

ガイダンス プログラムの 1 行目に以下のように自分の入れること // vm12345 杉崎えり子 情報科学 B 第 10 回 GUI 情報科学 B Info2/3 info10 今日のフォルダー作成 Example10_1.java 1 今日やること Windows などで見られるウィンドウを作 成して (GUI プログラム ) そこに実行結 果を表示させる 2 ウィンドウの作成 Java を使用してウィンドウを作成をしたい

More information

VB 資料 電脳梁山泊烏賊塾 音声認識 System.Speech の利用 System.Speech に依るディクテーション ( 音声を文字列化 ).NetFramework3.0 以上 (Visual Studio 2010 以降 ) では 標準で System.Speech が用意されて居るの

VB 資料 電脳梁山泊烏賊塾 音声認識 System.Speech の利用 System.Speech に依るディクテーション ( 音声を文字列化 ).NetFramework3.0 以上 (Visual Studio 2010 以降 ) では 標準で System.Speech が用意されて居るの 音声認識 System.Speech の利用 System.Speech に依るディクテーション ( 音声を文字列化 ).NetFramework3.0 以上 (Visual Studio 2010 以降 ) では 標準で System.Speech が用意されて居るので 此れを利用して音声認識を行うサンプルを紹介する 下記の様な Windows フォームアプリケーションを作成する エディタを起動すると

More information

概要 ABAP 開発者が SAP システム内の SAP ソースまたは SAP ディクショナリーオブジェクトを変更しようとすると 2 つのアクセスキーを入力するよう求められます 1 特定のユーザーを開発者として登録する開発者キー このキーは一度だけ入力します 2 SAP ソースまたは SAP ディクシ

概要 ABAP 開発者が SAP システム内の SAP ソースまたは SAP ディクショナリーオブジェクトを変更しようとすると 2 つのアクセスキーを入力するよう求められます 1 特定のユーザーを開発者として登録する開発者キー このキーは一度だけ入力します 2 SAP ソースまたは SAP ディクシ オンラインヘルプ :SAP ソフトウェア変更登録 (SSCR) キーの登録 目次 概要... 2 参考リンク... 3 アプリケーションの起動... 4 アプリケーションとメインコントロールの概要... 5 キーリストのカスタマイズ... 7 リストのフィルタリング... 7 表のレイアウトのカスタマイズ... 8 新しい開発者の登録... 10 新しいオブジェクトの登録... 12 特定のインストレーションから別のインストレーションに個々の

More information

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション 1 02 グラフゖックで簡単な図形を描く図形描画プログラム 1 今回作成するゕプリケーションの概要 ボタンをクリックすると図形を描くプログラム 行われる動作 [1] ボタンをクリック [2] そのボタンに対する図形を描く これを使用者とコンピュータの関係で描くと [ 使用者 コンピュータ ] ボタンをクリック [ 使用者 コンピュータ ] 図形を描画して見せる 使用者がコンピュータにすること ボタンをクリック

More information

目次 専用アプリケーションをインストールする 1 アカウントを設定する 5 Windows クライアントから利用できる機能の紹介 7 1ファイル フォルダのアップロードとダウンロード 8 2ファイル更新履歴の管理 10 3 操作履歴の確認 12 4アクセスチケットの生成 ( フォルダ / ファイルの

目次 専用アプリケーションをインストールする 1 アカウントを設定する 5 Windows クライアントから利用できる機能の紹介 7 1ファイル フォルダのアップロードとダウンロード 8 2ファイル更新履歴の管理 10 3 操作履歴の確認 12 4アクセスチケットの生成 ( フォルダ / ファイルの ServersMan@Disk Windows 版専用アプリケーション操作マニュアル 目次 専用アプリケーションをインストールする 1 アカウントを設定する 5 Windows クライアントから利用できる機能の紹介 7 1ファイル フォルダのアップロードとダウンロード 8 2ファイル更新履歴の管理 10 3 操作履歴の確認 12 4アクセスチケットの生成 ( フォルダ / ファイルの公開 ) 13

More information

2.Picasa3 の実行 デスクトップの をダブルククリック 一番最初の起動の時だけ下記画 面が立ち上がります マイドキュメント マイピクチャ デスクトップのみスキャン にチェックを入れ続行 これはパソコン内部の全画像を検索して Picasa で使用する基本データを作成するものですが 完全スキャン

2.Picasa3 の実行 デスクトップの をダブルククリック 一番最初の起動の時だけ下記画 面が立ち上がります マイドキュメント マイピクチャ デスクトップのみスキャン にチェックを入れ続行 これはパソコン内部の全画像を検索して Picasa で使用する基本データを作成するものですが 完全スキャン Picasa3 を使った写真の整理 写真の整理はエクスプローラーを開いてフォルダの作成から写真の移動やコピーを行うことが望ましいのですが エクスプローラーの操作を覚えられずに写真の整理が進んでいない人のために画像管理ソフト Picasa3 を使った整理方法を説明します なお このソフトは画像に関する多くの機能を持ったものですが 画像整理だけの利用では容量も大きいですからエクスプローラーの使い方をマスターしている人はこのソフトを使う必要はありません

More information

編集する ファイルを開く マイクロデータの設定を行うファイルまたはファイルを開きます 開かれたファイルは編集画面に表示されて ブラウザ表示した時のプレビューも同時に表示されます HTML ファイルの選択 編集する ファイルを開くためにメインメニューから ファイル 開く を選びます ファイル選択ダイア

編集する ファイルを開く マイクロデータの設定を行うファイルまたはファイルを開きます 開かれたファイルは編集画面に表示されて ブラウザ表示した時のプレビューも同時に表示されます HTML ファイルの選択 編集する ファイルを開くためにメインメニューから ファイル 開く を選びます ファイル選択ダイア 基本操作編 編集するファイルを開く... ファイルの選択... 各パネルの表示非表示... マイクロデータ : の編集... 編集するテキストの選択... 適用するテキストの選択... アイテムタイプの選択... アイテムタイプの検索... よく使うアイテムタイプの登録... よく使うアイテムタイプの削除... 定型セットの登録... 定型セットの削除... 定型セット内のアイテムタイプの削除...

More information

( 目次 ) 1. はじめに 開発環境の準備 仮想ディレクトリーの作成 ASP.NET のWeb アプリケーション開発環境準備 データベースの作成 データベースの追加 テーブルの作成

( 目次 ) 1. はじめに 開発環境の準備 仮想ディレクトリーの作成 ASP.NET のWeb アプリケーション開発環境準備 データベースの作成 データベースの追加 テーブルの作成 KDDI ホスティングサービス (G120, G200) ブック ASP.NET 利用ガイド ( ご参考資料 ) rev.1.0 KDDI 株式会社 1 ( 目次 ) 1. はじめに... 3 2. 開発環境の準備... 3 2.1 仮想ディレクトリーの作成... 3 2.2 ASP.NET のWeb アプリケーション開発環境準備... 7 3. データベースの作成...10 3.1 データベースの追加...10

More information

ガイダンス

ガイダンス プログラムの 1 行目に以下のように自分の入れること // vm12345 杉崎えり子 情報科学 B 第 10 回 GUI 情報科学 B Info2/3 info10 今日のフォルダー作成 Example10_1.java 1 今日やること Windows などで見られるウィンドウを作 成して (GUI プログラム ) そこに実行結 果を表示させる 2 ウィンドウの作成 Java を使用してウィンドウの作成をしたい

More information

情報システム設計論II ユーザインタフェース(1)

情報システム設計論II ユーザインタフェース(1) 中村研究室ゼミ Web API / 取り込んで利用する 中村聡史 1 PHP + MySQL どうでした? データを集めるのが大変 データベースを構築するのが大変 データを入力してくのが大変 2 3 API Web API とは? Application Program Interface( 何らかの機能をプログラミングするための仕組み ) メソッド名 + 引数で何らかの動作を実現する! Web API

More information

Prog2_9th

Prog2_9th 2017 年 11 月 30 日 ( 木 ) 実施 Canvas による描画 Canvas とは Canvas は, 描画コールを保持するためのクラスである 描画には, 次の 4 つの要素が必要である (1) ビットマップピクセル ( 画素 ) を保持 (2) キャンバス描画コール ( ビットマップへの書き出し要請 ) に対応 (3) 描画プリミティブ描画領域, パス, テキスト, ビットマップ等

More information

.NET Framework 4.0 世代の Expression Trees

.NET Framework 4.0 世代の Expression Trees .NET Framework 4.0 世代の Expression Trees September 26 th, 2009 渋木宏明 ( ひどり ) Microsoft MVP for C# 自己紹介 プロフィール 名前 渋木宏明 ( ひどり ) 出身地 東京都 職業 フリーランスの開発者 技術分野 Visual C#, Windows.Forms コミュニティ活動 ホームページ http://hidori.jp/

More information

Java言語 第1回

Java言語 第1回 Java 言語 第 2 回簡単な Java プログラムの作成と実行 知的情報システム工学科 久保川淳司 kubokawa@me.it-hiroshima.ac.jp 簡単な Java プログラム Java プログラムのファイル名 Java プログラムのファイル名命名ルール ファイル名とクラス名は同じでなければならない HelloJava.java public class HelloJava { public

More information

Abstract Kinect for Windows RGB Kinect for Windows v Kinect for Windows v2

Abstract Kinect for Windows RGB Kinect for Windows v Kinect for Windows v2 Kinect 2014 9 19 IS Report No. 2014092901 Report Medical Information System Laboratory Abstract Kinect for Windows 2012 2 RGB Kinect for Windows v2 2014 7 Kinect for Windows v2 1............................

More information

UMLプロファイル 機能ガイド

UMLプロファイル 機能ガイド UML Profile guide by SparxSystems Japan Enterprise Architect 日本語版 UML プロファイル機能ガイド (2016/10/07 最終更新 ) 1. はじめに UML では ステレオタイプを利用することで既存の要素に意味を追加し 拡張して利用することができます このステレオタイプは個々の要素に対して個別に指定することもできますが ステレオタイプの意味と適用する

More information

VB.NET解説

VB.NET解説 Visual Basic.NET 印刷編 目次 印刷の概要... 2 印刷の流れ... 2 標準の Windows フォーム印刷ジョブの作成... 3 実行時に於ける Windows フォーム印刷オプションの変更... 3 Windows フォームに於ける接続されたプリンタの選択... 4 Windows フォームでのグラフィックスの印刷... 5 Windows フォームでのテキストの印刷...

More information

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド メソッド ( 教科書第 7 章 p.221~p.239) ここまでには文字列を表示する System.out.print() やキーボードから整数を入力する stdin.nextint() などを用いてプログラムを作成してきた これらはメソッドと呼ばれるプログラムを構成する部品である メソッドとは Java や C++ などのオブジェクト指向プログラミング言語で利用されている概念であり 他の言語での関数やサブルーチンに相当するが

More information

CubePDF ユーザーズマニュアル

CubePDF ユーザーズマニュアル CubePDF ユーザーズマニュアル 2018.11.22 第 13 版 1 1. PDF への変換手順 CubePDF は仮想プリンターとしてインストールされます そのため Web ブラウザや Microsoft Word, Excel, PowerPoint など印刷ボタンのあるアプリケーションであればどれでも 次の 3 ステップで PDF へ変換することができます 1. PDF 化したいものを適当なアプリケーションで表示し

More information

やってみようINFINITY-写真管理 編-

やってみようINFINITY-写真管理 編- 目次 やってみよう for Wingneo INFINITY やってみよう for Wingneo INFINITY... 1 目次... 1 システムの起動... 1 写真管理に登録する写真を準備する... 1 写真管理 ( 電子納品 ) の操作方法... 2 写真整理... 2 成果区分の設定... 4 成果管理から電納編集ツールへの操作方法... 5 電納編集ツール ( 写真管理 ) の操作方法

More information

wpf #wpf

wpf #wpf wpf #wpf 1 1: wpf 2 2 2 Examples 2 Hello World 2 2: "" 7 7 Examples 7 7 11 3: System.Windows.Controls.WebBrowser 13 13 13 Examples 13 BusyIndicatorWeb 13 4: WPF 14 14 Examples 14 14 15 ComboBox 17 21 DoubleAnimation

More information

目次 更新履歴... 1 画面設計書の目的... 3 必要な内容... 3 画面一覧... 4 必要な内容... 4 画面遷移... 5 画面レイアウト... 6 入力パラメータ... 7 必要な内容... 7 項目定義... 8 必要な内容... 8 部品の種類... 9 ( 参考 ) 部品指定と

目次 更新履歴... 1 画面設計書の目的... 3 必要な内容... 3 画面一覧... 4 必要な内容... 4 画面遷移... 5 画面レイアウト... 6 入力パラメータ... 7 必要な内容... 7 項目定義... 8 必要な内容... 8 部品の種類... 9 ( 参考 ) 部品指定と 画面設計書の作成 作成日 : 2015/06/30 作成者 : 西村 更新履歴 更新日 更新 作業者 2015/06/30 新規作成 ( 仮 ) 西村 2015/11/09 部品の種類 にカラーピッカーとグラフを追加 コンボボックスの HTML の説明の 西村 追加 2017/12/01 公開用の体裁調整 西村 1 目次 更新履歴... 1 画面設計書の目的... 3 必要な内容... 3 画面一覧...

More information

目次 はじめに 4 概要 4 背景 4 対象 5 スケジュール 5 目標点 6 使用機材 6 第 1 章 C# 言語 7 C# 言語の歴史 7 基本構文 8 C 言語との違い 9 Java 言語との違い 10.Netフレームワーク 10 開発資料 10 第 2 章 Mono 11 Monoの歴史 1

目次 はじめに 4 概要 4 背景 4 対象 5 スケジュール 5 目標点 6 使用機材 6 第 1 章 C# 言語 7 C# 言語の歴史 7 基本構文 8 C 言語との違い 9 Java 言語との違い 10.Netフレームワーク 10 開発資料 10 第 2 章 Mono 11 Monoの歴史 1 ポリテクセンター埼玉セミナー資料 組込み技術者のための C# Monoを用いたマルチプラットフォームアプリケーション開発技術 第 1.2 版 2018 年 8 月 Microbrains Inc. 渋谷 目次 はじめに 4 概要 4 背景 4 対象 5 スケジュール 5 目標点 6 使用機材 6 第 1 章 C# 言語 7 C# 言語の歴史 7 基本構文 8 C 言語との違い 9 Java 言語との違い

More information

プレポスト【問題】

プレポスト【問題】 コース名 : 基礎から学ぶ!Excel VBA による業務の自動化 受講日 氏名 1 Excel VBA を使用するメリットとして誤っているものを 1 つ選びなさい 1. 手作業では手間のかかる作業も プログラムに記述した処理は一括して実行されるため 何段階ものメニュー操作を行う必要がなくなる 2. プログラムに書いた処理は記述どおりに実行されるため だれがいつ何回行っても確実な処理がなされ 誤動作を防ぐことができる

More information

平成 30 年度 プログラミング研修講座 岩手県立総合教育センター

平成 30 年度 プログラミング研修講座 岩手県立総合教育センター 平成 30 年度 プログラミング研修講座 岩手県立総合教育センター 目次第 1 章プログラミングについて 1 ソフトウェアの働き 1 2 プログラミング言語 1 3 主なプログラミング言語の歴史 2 第 2 章 Visual Basic について 1 Visual Basic とは 3 2.NET Framework の環境 3 3 Visual Basic と.NET Framework の関係

More information

第 1 章 : はじめに RogueWave Visualization for C++ の Views5.7 に付属している Views Studio を使い 簡単な GUI アプリケーションの開発手順を紹介します この文書では Windows 8 x64 上で Visual Studio2010

第 1 章 : はじめに RogueWave Visualization for C++ の Views5.7 に付属している Views Studio を使い 簡単な GUI アプリケーションの開発手順を紹介します この文書では Windows 8 x64 上で Visual Studio2010 RW View Studio Getting Started (1) : 簡単な GUI アプリケーションを作成する 目次 第 1 章はじめに...1 1.1 アプリケーションの概要... 1 1.2 Views Studio とは... 2 第 2 章 Views Studio を起動する...3 2.1 起動画面 ( メインウィンドウ ) の説明... 4 2.2 ガジェットエクステンション...

More information

ウィンドウ操作 応用

ウィンドウ操作 応用 Win32API 関数 ウィンドウ操作 ウィンドウ名でトップレベルウィンドウ ( 親を持たないウィンドウ ) のハンドルを取得 メモ帳や電卓等のウィンドウ名でトップレベルウィンドウ ( 親を持たないウィンドウ ) のハンドルを取得する方法を 下記に示す Visual Basic Imports System.Runtime.InteropServices Public Class WindowFromWindowName

More information

新しいイテレーション型開発

新しいイテレーション型開発 2 XAML WPF Windows Presentation Foundation 4 / 4 5 Silverlight 5 XAML 6 6 XAML 6 6 7 8 8 9 XAML 9 XAML 12 12 / / 13 / 14 15 XAML 15 Expression Blend 15 Visual Studio 2008 16 XAML 16 Microsoft Expression

More information

フォト アルバム

フォト アルバム 操作説明書 ESCORT 目次 ESCORT 目次 ESCORT 操作の流れログイン / ログアウト方法ホーム ( メニュー ) ユーザー管理 ユーザー登録 / ユーザー修正方法 ユーザー削除方法ディレクトリ管理 ディレクトリ登録 / ディレクトリ修正方法 ディレクトリ削除方法ディレクトリ切替テンプレート管理 テンプレート登録 / テンプレート再設定方法 テンプレート削除方法 特殊タグ設定方法定数タグ設定

More information

やってみようINFINITY-製品仕様書 品質評価表 メタデータ 編-

やってみようINFINITY-製品仕様書 品質評価表 メタデータ 編- やってみよう for Wingneo INFINITY( ) はじめに 目的このプログラムは 空間データ製品仕様書作成を支援するシステムです 空間データ製品仕様書 (Microsoft Word 文書 ) を作成する場合は Microsoft Word がインストールされている必要があります 操作手順 製品仕様書作成から品質評価表を経由して簡易メタデータを作成し 国土交通省国土地理院のメタデータエディターに取り込みまでを解説しています

More information