SHOEISHA iD

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

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

ComponentZine(ComponentOne)

ドロップダウンリストを使ったSilverlightアプリケーションの作成

ComponentOne Studio for SilverlightのC1DropDownコントロールを使ったWebページの作成

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

 ComponentOne Studio for SilverlightのC1DropDownコントロールは、Silverlight標準のコントロールにはないドロップダウンリストコントロールを、Webページ上で使えるコントロールです。今回は、このC1DropDownコントロールにTreeViewコントロールを組み合わせて書籍のリストを表示し、書籍名をクリックするとそのカバー写真を表示するSilverlightアプリケーションを作成してみました。

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

はじめに

 ComponentOne Studio for SilverlightのC1DropDownコントロールは、Silverlight標準のコントロールにはないドロップダウンリストコントロールを、Webページ上で使えるコントロールです。ドロップダウンリストが使えると、少ないスペースでユーザーに選択してもらう複数の候補が設定できるのでとても便利ですね。

 今回は、このC1DropDownコントロールにTreeViewコントロールを組み合わせて書籍のリストを表示し、書籍名をクリックするとそのカバー写真を表示するSilverlightアプリケーションを作成してみました。

C1DropDownコントロールをクリックすると、TreeViewコントロールで作成したリストが表示される
C1DropDownコントロールをクリックすると、TreeViewコントロールで作成したリストが表示される
リストをクリックすると書籍のカバー写真が表示される
リストをクリックすると書籍のカバー写真が表示される

対象読者

 Visual Basic/Visual C# 2008を使ってプログラムを作ったことのある人。また、SilverlightおよびXAMLに対する基礎的な知識が必要になります。

必要な環境

 Visual Basic 2008、Visual C# 2008、Visual Studio 2008でプログラムが作れる環境。また、Visual Studio 2008 Silverlight Tools 3.0をインストールしていることが必須条件です。

 なお、本プログラムはWindows Vista上で動作するVisual Studio 2008およびVisual Studio 2008 Silverlight Tools 3.0を使用して作成し、Internet Explorer 8で動作確認を行っています。

※サンプルアプリケーションについて

本稿のサンプルアプリケーションをVisual Studioでそのまま実行すると、ASP.NETアプリケ―ション(sl_dropdown_cs.Web)ではなく、Silverlightアプリケ―ション(sl_dropdown_cs)として実行されるため、画像が表示されない問題が発生します。画像を表示させるには、あらかじめ次の手順を実行してください。

 

  • ASP.NET Webサイトプロジェクトを右クリックして、[スタートアッププロジェクトに設定]を選択

コンポーネントのインストール

 DropDown for Silverlightを使用する方は、Visual Studio、Visual Basic、Visual C#の開発環境にComponentOne Studio Enterprise 2010Jをインストールする必要があります。

 インストーラは、グレープシティのWebページからダウンロードできます。製品ページの[申込フォーム]をクリックし、グレープシティのWebサイトへ必要情報を登録すると、添付トライアルライセンスキーファイルとダウンロードサイトを記載したE-Mailが送られてきますので、ここからダウンロードします。制限事項などの詳細については、インストーラに同梱されているリリースノートを参照ください。

C1DropDownコントロールについて

 ComponentOne Studio for SilverlightのC1DropDownコントロールは、セットアップが簡単で、単一項目を選択できるドロップダウンリストを表示する機能を持ったコントロールです。

 C1DropDownコントロールは、ヘッダー領域とコンテンツ領域の2つのパーツで構成されます。ヘッダーはドロップダウンボックスが開いていないときに表示され、TextBlockコントロールなどと組み合わせて、ドロップダウンリストのタイトルの設定に使用します。コンテンツはドロップダウン領域をクリックすると表示され、リスト表示できるコントロールを組み込んでコンテンツを作成します。コンテンツはまったく追加しない、ヘッダー領域とコンテンツ領域の一方に追加する、両方に追加するといったようにカスタマイズすることも可能です。

 ヘッダーとコンテンツを定義するのには、<c1:C1DropDown.Header>タグと<c1:C1DropDown.Content>タグを使用します。これらのタグの内側に、設定したいコントロールやコンテンツを追加します。

各部位の名称(ヘルプファイルより抜粋)
各部位の名称(ヘルプファイルより抜粋)

 C1DropDownコントロールのドロップダウン矢印をユーザーがクリックすると、デフォルトではコントロールの下にリストが表示されます。ページのレイアウト位置によってコントロールの下に表示できない場合は、コントロールの上に表示されます。ただし、「DropDownDirection」プロパティを使用することで、ドロップダウンリストを表示する場所をカスタマイズできます。

 「DropDownDirection」プロパティは、次のいずれかのオプションに設定できます。

「DropDownDirection」プロパティのオプション
設定値 説明
BelowOrAbove(デフォルト) ドロップダウンボックスをヘッダーの下に表示するように試みます。表示できない場合は、その上に表示するように試みます。
AboveOrBelow ドロップダウンボックスをヘッダーの上に表示するように試みます。表示できない場合は、その下に表示するように試みます。
ForceBelow ドロップダウンボックスをヘッダーの下に強制的に表示します。
ForceAbove ドロップダウンボックスをヘッダーの上に強制的に表示します。

 また、「DropDownDirection」プロパティ以外にコントロールの外観や動作の機能を設定するために、次のようないくつかのプロパティがあります。

「DropDownDirection」プロパティ以外の外観・動作設定用プロパティ
プロパティ 説明
AutoClose ドロップダウンボックス以外の場所をクリックすると自動的に閉じます。
DisabledCuesVisibility コントロールのビジュアルのうち、無効になっているものを表示するかどうかを示す値を取得します。
DropDownHeight ドロップダウンボックスの高さを取得または設定します(自動的にサイズ指定する場合はゼロに設定)。
DropDownWidth ドロップダウンボックスの幅を取得または設定します(自動的にサイズ指定する場合はゼロに設定)。
FocusCuesVisibility コントロールのビジュアルのうち、フォーカスがあるものを表示するかどうかを示す値を取得します。
IsDropDownOpen コントロールのドロップダウンボックスを開閉します。
ShowButton ToggleButton が表示されるかどうかを取得/設定します。

 ドロップダウンリストとなるコンテンツ領域には、テキスト、画像などの標準コントロールやサードパーティのコントロールなど、任意の種類のコンテンツを追加できます。例えば、Buttonコントロールをドロップダウンリストに追加するには、次のようなXAMLを記述します。

<c1:C1DropDown Height="30" Name="c1dropdown1" Width="100">
<Button Height="23" Name="button1" Width="75">Hello World!</Button>
</c1:C1DropDown>

 C1DropDownコントロールには、2つの基本的なイベントが用意されています。ドロップダウンリストが選択された処理は、それぞれコンテンツ領域に設定したコントロールのイベントハンドラを利用して処理を組み立てます。

C1DropDownコントロールの基本イベント
イベント 説明
IsDropDownOpenChanged IsDropDownOpen プロパティが変更されたときに発生するイベントです。
IsMouseOverChanged IsMouseOver プロパティが変更されたときに発生するイベントです。

Webページの作成

 では、さっそくWebページを作成してみましょう。今回は、C1DropDownコントロールのドロップダウンリストに、Silverlight標準のTreeViewコントロールを組み込み、書籍名のリストをツリー状に表示するようにします。そして、リストの項目名をクリックすると、同じくSilverlight標準のImageコントロールに書籍のカバー写真を表示します。

 グリッドは2列に設定し、左側にドロップダウンリストを、右側にImageコントロールを配置します。また、それぞれのコントロールの「Effect」プロパティにDropShadowEffectを設定し、影付きの表示にします。C1DropDownコントロールのHeader部分は、TextBlockコントロールでタイトルを表示します。

コントロールのレイアウト(※グリッドの枠線を表示しています)
コントロールのレイアウト(※グリッドの枠線を表示しています)

Silverlightプロジェクトの作成

 まずは、Silverlightプロジェクトの作成からです。

 Visual Studio 2008 Silverlight Tools 3.0をインストールし、Visual Studioで新しいプロジェクトを作成すると、「プロジェクトの種類」に[Silverlight]が追加されています。これを選んで「テンプレート」から[Silverlightアプリケーション]を選択します。

「Silverlightアプリケーション」を選択
「Silverlightアプリケーション」を選択

 「新しいSilverlightアプリケーション」というダイアログボックスが表示されるので、「新しいWebプロジェクトの種類」でリストから「ASP.NET Webサイト」を選びます。

リストから「ASP.NET Webサイト」を選ぶ
リストから「ASP.NET Webサイト」を選ぶ

 プロジェクトが作成され、新しいWebサイトに「MainPage.xaml」が作られてXAMLのコードが表示されます。

 Silverlight標準のTreeViewコントロールを使用するので、プロジェクトウィンドウの「参照設定」に[System.Windows.Controls]を設定します。

「参照設定」に[System.Windows.Controls]を設定
「参照設定」に[System.Windows.Controls]を設定

 XAMLコードのヘッダー部分に、次の1行を追加します。

<UserControl xmlns:c1="clr-namespace:C1.Silverlight;assembly=C1.Silverlight"  x:Class="sl_dropdown_vb.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"  
xmlns:controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls"    ← この1行を追加
mc:Ignorable="d" d:DesignWidth="640" d:DesignHeight="480">

 プロジェクトウィンドウの「ClientBin」フォルダ内に「Images」フォルダを作成し、この中に画像イメージのファイルを格納します。

 これは、Imageコントロールの「Source」プロパティにファイルを設定するには、ファイルへの絶対URLを指定するか、アプリケーションのXAPファイルを基準とする相対URLを指定するようになっているためです。Webサーバーのどの位置にこのアプリケーションが配置されるのかが分からないので、XAPファイルを基準とする相対URLで画像ファイルを指定するようにし、画像ファイルを格納しておきます。

「ClientBin」フォルダ内に「Images」フォルダを作成し、この中に画像ファイルを格納する
「ClientBin」フォルダ内に「Images」フォルダを作成し、この中に画像ファイルを格納する

グリッドの設定

 次に、グリッドを作成します。今回は、2列のグリッドに設定するので「ColumnDefinitions」を使います。

<Grid x:Name="LayoutRoot" ShowGridLines="False">
<Grid.ColumnDefinitions>
    <ColumnDefinition Width="300"/>
    <ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
</Grid>

C1DropDownコントロールの作成

 次に、ツールボックスにある[C1DropDownコントロール]アイコンをダブルクリックして、C1DropDownコントロールを作成します。

 コントロールのサイズは、Widthプロパティを「100」、Heightプロパティを「30」に設定し、Effectプロパティに「DropShadowEffect」を設定します。

<c1:C1DropDown Grid.Column="0" HorizontalAlignment="Right" Margin="0,15,0,0" 
           VerticalAlignment="Top"  Width="100" Height="30">
<c1:C1DropDown.Effect>
    <DropShadowEffect Color="Black" BlurRadius="5" />
</c1:C1DropDown.Effect>

 Headerプロパティを使ってヘッダー部分にTextBlockコントロールを組み込んでタイトルを作成します。

 まず、Headerプロパティに<ContentControl>タグを記述します。これで、Header領域にコントロールが追加できるので、このタグの中にTextBlockコントロールを組み込みます。

<c1:C1DropDown.Header>
<ContentControl VerticalAlignment="Center" HorizontalAlignment="Center">
    <TextBlock x:Name="selection" Text="≪ 書籍案内 ≫" FontSize="12" Foreground="SlateBlue"
               TextAlignment="left" Margin="0,-15,0,0" />
</ContentControl>
</c1:C1DropDown.Header>

コンテンツ領域の作成

 コンテンツ領域にドロップダウンリストを作成していきます。「Content」プロパティの中にTreeViewコントロールを作成し、TreeViewItemオブジェクトを使用して書籍のタイトルを階層状に作成していきます。また、イベントハンドラ「SelectedItemChanged」を作成します。

<c1:C1DropDown.Content>
    <controls:TreeView x:Name="TreeView1" Background="Transparent" Margin="10"
                       SelectedItemChanged="TreeView1_SelectedItemChanged">
        <controls:TreeViewItem Header="マイクロソフトオフィス教科書">
            <controls:TreeViewItem Header="Excel2007" />
            <controls:TreeViewItem Header="Word2007" />
            <controls:TreeViewItem Header="PowerPoint2007" />
            <controls:TreeViewItem Header="Access2007" />
        </controls:TreeViewItem>
        <controls:TreeViewItem Header="情報処理教科書 2011年版">
            <controls:TreeViewItem Header="ITストラテジスト" />
            <controls:TreeViewItem Header="ネットワークスペシャリスト" />
            <controls:TreeViewItem Header="システムアーキテクト" />
            <controls:TreeViewItem Header="ITサービスマネージャ" />
        </controls:TreeViewItem>
            <controls:TreeViewItem Header="10日でおぼえる">
                <controls:TreeViewItem Header="Excel VBA" />
                <controls:TreeViewItem Header="Visual Basic2005" />
                <controls:TreeViewItem Header="Excel 関数" />
            </controls:TreeViewItem>
        </controls:TreeView>
</c1:C1DropDown.Content>
</c1:C1DropDown>

Imageコントロールの作成

 C1DropDownコントロールの下に、Imageコントロールを作成します。
デフォルト表示用に「blank.jpg」という画像ファイルを指定しますが、このときファイルの位置をXAPファイルを基準とする相対URLで指定します。
また、ドロップシャドウを付けておきます。

<Image x:Name="image1" Source="images/blank.jpg" Grid.Column="1" Margin="0,15,0,0" Height="150" 
       HorizontalAlignment="Center" VerticalAlignment="Top" >
        <Image.Effect>
            <DropShadowEffect Color="Black" BlurRadius="5" />
        </Image.Effect>
</Image>

 以上でUI部分は完成です。

ビハインドコードの作成

 今度は、ドロップダウンリストの書籍名がクリックされると、Imageコントロールに書籍のカバー画像を表示する処理を作成します。この処理は、C1DropDownコントロールのイベントハンドラではなく、リスト表示を行っているTreeViewコントロールのイベントハンドラを利用します。

 TreeViewコントロールでユーザーがリスト項目を選択すると、SelectedItemChangedイベントが発生するので、このイベントハンドラで「TreeView1」クラスのSelectedItemプロパティからリスト項目の文字列を取得し、関連する画像ファイルをImageコントロールに設定します。

 Imageコントロールに画像を設定するには、「Source」プロパティを利用します。このプロパティに、画像ファイルをBitmapImageオブジェクトに変換して設定します。BitmapImageオブジェクトを使用するので、「System.Windows.Media.Imaging」名前空間への参照を設定するのを忘れないでください。

Visual Basic
Imports System.Windows.Media.Imaging

Partial Public Class MainPage
Inherits UserControl

Public Sub New()
    InitializeComponent()
End Sub


Private Sub TreeView1_SelectedItemChanged(ByVal sender As System.Object, ByVal e As System.Windows.RoutedPropertyChangedEventArgs(Of System.Object))
    Dim tvi As TreeViewItem = TreeView1.SelectedItem
    Select Case tvi.Header
        Case "Excel2007"
            image1.Source = New BitmapImage(New Uri("images/MOS_Excel.jpg", UriKind.RelativeOrAbsolute))
        Case "Word2007"
            image1.Source = New BitmapImage(New Uri("images/MOS_Word.jpg", UriKind.RelativeOrAbsolute))
        Case "PowerPoint2007"
            image1.Source = New BitmapImage(New Uri("images/MOS_PP.jpg", UriKind.RelativeOrAbsolute))
        Case "Access2007"
            image1.Source = New BitmapImage(New Uri("images/MOS_Access.jpg", UriKind.RelativeOrAbsolute))
        Case "ITストラテジスト"
            image1.Source = New BitmapImage(New Uri("images/ITストラテジスト.jpg", UriKind.RelativeOrAbsolute))
        Case "ネットワークスペシャリスト"
            image1.Source = New BitmapImage(New Uri("images/ネットワークスペシャリスト.jpg", UriKind.RelativeOrAbsolute))
        Case "システムアーキテクト"
            image1.Source = New BitmapImage(New Uri("images/システムアーキテクト.jpg", UriKind.RelativeOrAbsolute))
        Case "ITサービスマネージャ"
            image1.Source = New BitmapImage(New Uri("images/サービスマネージャ.jpg", UriKind.RelativeOrAbsolute))
        Case "Excel VBA"
            image1.Source = New BitmapImage(New Uri("images/10日VBA.jpg", UriKind.RelativeOrAbsolute))
        Case "Visual Basic2005"
            image1.Source = New BitmapImage(New Uri("images/10日VB2005.jpg", UriKind.RelativeOrAbsolute))
        Case "Excel 関数"
            image1.Source = New BitmapImage(New Uri("images/10日関数.jpg", UriKind.RelativeOrAbsolute))
    End Select
End Sub
End Class
C#
using System.Windows.Media.Imaging;

namespace sl_dropdown_cs
{
public partial class MainPage : UserControl
{
    public MainPage()
    {
        InitializeComponent();
    }

    private void TreeView1_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
    {
        TreeViewItem tvi = (TreeViewItem)TreeView1.SelectedValue;
        String s = tvi.Header.ToString();
        
        switch(s)
        {
            case "Excel2007":
                image1.Source = new BitmapImage(new Uri("images/MOS_Excel.jpg", UriKind.RelativeOrAbsolute));
            break;
            case "Word2007":
            image1.Source = new BitmapImage(new Uri("images/MOS_Word.jpg", UriKind.RelativeOrAbsolute));
            break;
            case "PowerPoint2007":
                image1.Source = new BitmapImage(new Uri("images/MOS_PP.jpg", UriKind.RelativeOrAbsolute));
            break;
            case "Access2007":
                image1.Source = new BitmapImage(new Uri("images/MOS_Access.jpg", UriKind.RelativeOrAbsolute));
            break;
            case "ITストラテジスト":
                image1.Source = new BitmapImage(new Uri("images/ITストラテジスト.jpg", UriKind.RelativeOrAbsolute));
            break;
            case "ネットワークスペシャリスト":
                image1.Source = new BitmapImage(new Uri("images/ネットワークスペシャリスト.jpg", UriKind.RelativeOrAbsolute));
            break;
            case "システムアーキテクト":
                image1.Source = new BitmapImage(new Uri("images/システムアーキテクト.jpg", UriKind.RelativeOrAbsolute));
            break;
            case "ITサービスマネージャ":
                image1.Source = new BitmapImage(new Uri("images/サービスマネージャ.jpg", UriKind.RelativeOrAbsolute));
            break;
            case "Excel VBA":
                image1.Source = new BitmapImage(new Uri("images/10日VBA.jpg", UriKind.RelativeOrAbsolute));
            break;
            case "Visual Basic2005":
                image1.Source = new BitmapImage(new Uri("images/10日VB2005.jpg", UriKind.RelativeOrAbsolute));
            break;
            case "Excel 関数":
                image1.Source = new BitmapImage(new Uri("images/10日関数.jpg", UriKind.RelativeOrAbsolute));
            break;
        }
   }
}
}

まとめ

 Windowsフォームでは、ドロップダウンリストはGUIの常とう手段になっているコントロールですが、Silverlight標準のコントロールにはドロップダウンリストコントロールはありません。今回紹介したC1DropDownコントロールがWebで使えるとなると、プログラミングの幅がぐっと広がります。しかも、リスト部分にさまざまなコントロールを組み込むことができるので、これまでにないUIを持ったWebページをユーザーに提示することができるようになります。

製品情報

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

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

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

この記事をシェア

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

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング