はじめに
Sliverlightアプリケーションの特徴の1つは、綺麗な色使いをXAMLの各要素に施すことができることです。これにより、従来のHTMLを使ったWebページに比べ、格段に見栄えの良いページをデザインできます。
ComponentOne Studio for Silverlightに収録されているC1ColorPickerコントロールは、Webページ実行時にパレットから色を選択可能にする機能を提供するSilverlightコンポーネントです。
Windowsアプリケーションで使われるカラーピッカーと同様、1670万色のカラーパレットから任意の色を選択したり、Microsoft Office 2007で使われているカラーテーマに基づくパレットを表示してその中から選ぶこともできます。
今回は、このC1ColorPickerコントロールを使って、Webページ上の四角形オブジェクトのグラデーションカラー2色を、自由に変更できるアプリケーションを作成しました。
対象読者
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で動作確認を行っています。
コンポーネントのインストール
ComponentOne Studio for Silverlightを使用する方は、Visual Studio、Visual Basic、Visual C#の開発環境にComponentOne Studio Enterprise 2010Jをインストールする必要があります。
インストーラは、グレープシティのWebページからダウンロードできます。製品ページの[申込フォーム]をクリックし、グレープシティのWebサイトへ必要情報を登録すると、添付トライアルライセンスキーファイルとダウンロードサイトを記載したE-Mailが送られてきますので、ここからダウンロードします。制限事項などの詳細については、インストーラに同梱されているリリースノートを参照ください。
C1ColorPickerコントロールについて
ComponentOne Studio for SilverlightのC1ColorPickerコントロールは、Windowsフォームの色のダイアログボックスと同じような、対話式の色選択インターフェースを提供するコントロールです。透過性、16進数色表記、RGB(Red Green Blue)とHLS(Hue Saturation Lightness)のカラーモデルのサポートを含む豊富なビジュアル色入力インターフェースも備えています。
C1ColorPickerコントロールの表示モードについて
C1ColorPickerコントロールには、基本型(Basic)と拡張型(Advance)の2種類の表示形態があります。基本型(Basic)は、Microsoft Office 2007で使用されているカラーテーマと同様の20以上の定義済みカラーパレットを表示し、その中から色を選択するタイプです。各パレットの色はテーマに沿って調和がとれており、使用することで洗練された外観のアプリケーションを作成できます。
拡張型(Advance)は、カラーエディタを表示して、その中から色を選んでもらうタイプです。現在のパレットにない色を作成できます。
また、基本型と拡張型を2つとも表示させることも可能です。
基本型(Basic)C1ColorPickerコントロールの構成要素
基本型(Basic)C1ColorPickerコントロールは、次の要素から構成されています。
ドロップダウン矢印
C1ColorPickerコントロールのウィンドウを開きます。ドロップダウンウィンドウを表示する場所を、コントロールの上下、および状況ごとに自動的に切り替わるように指定できます。
[Basic]タブ
C1ColorPickerコントロールの表示モードを切り替えるタブです。
Selected Color
現在選択されている色がカラーピッカーのウィンドウに表示されます。
Picked Color
マウスでピックされた色が、カラーリストに赤色の境界線付きで表示されます。
Palette Colors
基本型(Basic)では、設定されたカラーパレットの色が反映されます。
Header Palette
パレットの基本色を表します。
Standard Colors
10色の標準色が表示されます。
Recent Colors
最近選択した色が最大10色まで表示されます。
拡張型(Advance)C1ColorPickerコントロールの構成要素
拡張型(Advance)C1ColorPickerコントロールは、次の要素から構成されています。
Color Slider
色スペクトルから色を選択するスライダです。
Color Field/Picked Color
[Picked Color]は、現在選択されている色を示します。[Color Slider]を移動して色合いを変えてから、[Color Field]で選択した色を調整します。
Transparency Slider
色の透過性を設定するスライダです。色は、不透過にすることも、部分的または完全な透過にすることもできます。
Color Preview
現在選択している色をプレビューします。
Transparency Value
色の透過性を数値で設定できます。透過性は、0
(完全に透過)と255
(完全に不透過:デフォルト)の間の整数に設定できます。
RGB Color
3つの数値ボックスにより、RGBカラーモデルを使って色を選択できます。
HSL Color
3つの数値ボックスにより、HSLカラーモデルを使って色を選択できます。
Hexadecimal Color
8桁の数値が表示されている場合、最初の2桁はFF
(不透過)から00
(透過)までの色の透過性を表し、下6桁は標準の16進数色の選択値を表します。ShowAlphaChannelプロパティがFalse
に設定されていると、下6桁のみが表示されます(透過値は表示されません)。
Selected Color
現在選択されている色がカラーピッカーのウィンドウに表示されます。
ドロップダウン矢印
C1ColorPickerコントロールのウィンドウを開きます。
[Advanced]タブ
C1ColorPickerコントロールの表示モードを切り替えるタブです。
カラーパレットについて
C1ColorPickerコントロールの表示モードが基本(Basic)モードの場合、前述のとおり、Microsoft Office 2007で使用されている20以上のカラーテーマの定義済みパレットを使うことができます。
カラーパレットを変更するには、Paletteプロパティに「Office2007ColorTheme列挙体」のメンバを指定します。Office2007ColorTheme列挙体メンバとして利用できるカラーパレットは次のとおりです。
メンバ名 | 値 | 説明 |
---|---|---|
Standard | 0 | 標準カラーテーマ |
Highlight | 1 | ハイライトカラーテーマ |
Office | 2 | オフィスカラーテーマ |
GrayScale | 3 | グレースケールカラーテーマ |
Apex | 4 | ひらめきカラーテーマ |
Aspect | 5 | シックカラーテーマ |
Civic | 6 | クールカラーテーマ |
Concourse | 7 | ビジネスカラーテーマ |
Equity | 8 | ジャパネスクカラーテーマ |
Flow | 9 | リゾートカラーテーマ |
Foundry | 10 | エコロジーカラーテーマ |
Median | 11 | デザートカラーテーマ |
Metro | 12 | メトロカラーテーマ |
Module | 13 | モジュールカラーテーマ |
Opulent | 14 | キュートカラーテーマ |
Oriel | 15 | スパイスカラーテーマ |
Origin | 16 | アースカラーテーマ |
Paper | 17 | ペーパーカラーテーマ |
Solstice | 18 | フレッシュカラーテーマ |
Technic | 19 | テクノロジーカラーテーマ |
Trek | 20 | トラベルカラーテーマ |
Urban | 21 | アーバンカラーテーマ |
Verve | 22 | ネオンカラーテーマ |
選択された色情報の取得と基本的なプロパティ
ユーザーがC1ColorPickerコントロールから色を選択すると、コントロールにはSelectedColorChangedイベントが発生し、C1ColorPickerコントロールのSelectedColorプロパティに選択した色がColor型で格納されます。
また、SelectedColorプロパティに値を設定しておくと、その色がコントロールの選択色ウィンドウに設定されます。
今回作成するWebページの構成
では、さっそくWebページを作成してみましょう。今回のプログラムでは、グリッドを使ってコントロールを配置します。
各コントロールの動作は、まず2つのC1ColorPickerコントロールを使ってグラデーションの開始色と終了色を選べるようにします。
基本モードのC1ColorPickerコントロールでは、リストボックスから5つのカラーテーマのパレットを選べるようにします。
C1ColorPickerコントロールで選んだ色は、すぐに四角形の塗りつぶしグラデーションに反映するように、C1ColorPickerコントロールのSelectedColorChangedイベントハンドラに処理を組み込みます。
Silverlightプロジェクトの作成
まずは、Silverlightプロジェクトの作成からです。
- Visual Studio 2008 Silverlight Tools 3.0をインストールし、Visual Studioで新しいプロジェクト作成すると、「プロジェクトの種類」に[Silverlight]が追加されています。これを選択し、「テンプレート」から[Silverlightアプリケーション]を選びます。
- 「新しいSilverlightアプリケーション」というダイアログボックスが表示されるので、「新しいWebプロジェクトの種類」リストから[ASP.NET Webサイト]を選びます。
- プロジェクトが作成され、新しいWebサイトに「MainPage.xaml」が作られてXAMLのコードが表示されます。
グリッドの作成
今回は、まず上下2段(1列2行)のグリッドを設定し、2行目を2列のグリッドに分割します。
グリッドに行を追加するには、RowDefinition要素を必要な行数分定義します。高さはHeightプロパティで指定します。また、列を設定するには、ColumnDefinitions要素を必要な列数分定義します。幅はWidthプロパティで指定します。
<Grid x:Name="LayoutRoot"> <!-- 最初に1列2行のグリッドを作成--> <Grid.RowDefinitions> <RowDefinition Height="*" /> <RowDefinition Height="*" /> </Grid.RowDefinitions> <!-- 2行目のグリッドを2列に分割--> <Grid x:Name="PaletteLayout" Grid.Row="1"> <Grid.ColumnDefinitions> <ColumnDefinition Width="*" /> <ColumnDefinition Width="*" /> </Grid.ColumnDefinitions> </Grid> </Grid>
タイトル文字と四角形の描画
1行目のグリッドにTextBlockとRectangleを作成し、タイトル文字と四角形を描画します。それぞれ、Effectプロパティを使ってドロップシャドウを設定します。
RectangleはFillプロパティで塗りつぶしますが、この時、線形グラデーションブラシ(LinearGradientBrush)を作成し、左上から右下にかけてグラデーションになるように設定します。XAMLを記述するのは、<Grid.RowDefinitions>
要素の下です。
<Grid x:Name="LayoutRoot" ShowGridLines="True"> <!-- 最初に1列2行のグリッドを作成--> <Grid.RowDefinitions> <RowDefinition Height="*" /> <RowDefinition Height="*" /> </Grid.RowDefinitions> <!-- 1行目のグリッドにTextBlockとRectangleを作成--> <TextBlock Margin="5" Grid.Row="0" Text="四角形のグラデーションの色を変更する" VerticalAlignment="Top" HorizontalAlignment="Center" FontSize="20" Foreground="Navy" ></TextBlock> <Rectangle x:Name="rc1" Grid.Row="0" Height="200" Width="600" HorizontalAlignment="Center" VerticalAlignment="Center"> <Rectangle.Fill> <LinearGradientBrush x:Name="colors"> <GradientStop x:Name="col1" Color="Black" Offset="0" /> <GradientStop x:Name="col2" Color="White" Offset="1" /> </LinearGradientBrush> </Rectangle.Fill> <Rectangle.Effect> <DropShadowEffect Color="Black" BlurRadius="5" /> </Rectangle.Effect> </Rectangle>
C1ColorPickerコントロールの作成
さきほど2列に分割した2行目のグリッドの最初の列に、C1ColorPickerコントロールを2つ作成します。
- C1ColorPickerコントロールは、横に並ぶようにStackPanelを使用してレイアウトします。StackPanelは、グリッドの左側の列に作成します。
- 開始色用C1ColorPickerコントロールは、Modeプロパティを「Advanced」にして拡張型に設定します。
- 終了色用C1ColorPickerコントロールは、Modeプロパティを「Basic」にして基本型に設定します。
- ドロップダウンの方向は、開始色用C1ColorPickerコントロールはDropDownDirectionプロパティを「AboveOrBelow」にして、コントロールの上側にカラーエディタが表示されるようにします。
- 終了色用C1ColorPickerコントロールはDropDownDirectionプロパティを「BelowOrAbove」にして、コントロールの下側にカラーエディタが表示されるようにします。
- どちらのC1ColorPickerコントロールも、あらかじめ表示する選択色は「White」に設定し、イベントハンドラを作成しておきます。
- また、C1ColorPickerコントロールはEffectプロパティが設定されていないので、StackPanelのEffectプロパティでドロップシャドウを付けます。
<!-- 2行目のグリッドを2列に分割--> <Grid x:Name="PaletteLayout" Grid.Row="1" ShowGridLines="True"> <Grid.ColumnDefinitions> <ColumnDefinition Width="*" /> <ColumnDefinition Width="*" /> </Grid.ColumnDefinitions> <!-- 左の列に横向きのStackPanelを使ってC1ColorPickerを2つ作成--> <StackPanel Height="Auto" Width="Auto" Grid.Column="0" HorizontalAlignment="Right" VerticalAlignment="Top" Orientation="Horizontal"> <c1ext:C1ColorPicker x:Name="c1cp1" Width="80" Height="80" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="5" DropDownDirection="AboveOrBelow" Mode="Both" SelectedColor="White" SelectedColorChanged="c1cp1_SelectedColorChanged"> </c1ext:C1ColorPicker> <c1ext:C1ColorPicker x:Name="c1cp2" Width="80" Height="80" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="5" DropDownDirection="BelowOrAbove" Mode="Basic" SelectedColor="White" SelectedColorChanged="c1cp2_SelectedColorChanged"> </c1ext:C1ColorPicker> <StackPanel.Effect> <DropShadowEffect Color="Black" BlurRadius="5" /> </StackPanel.Effect> </StackPanel>
ListBoxの作成
作成したStackPanelの下に、もう1つ縦向きのStackPanelを作成し、グリッドの右側の列に配置します。そして、StackPanelの中にTextBlockとListBoxを作成します。
ListBoxは、リスト選択のイベントハンドラを作成し、ListBoxItemプロパティを使用してカラーパレットの5つのテーマ名を設定します。TextBlockとListBoxは、いずれもEffectプロパティでドロップシャドウを設定します。
<!-- 右の列に縦向きのStackPanelを使ってTextBlockとListBoxを作成--> <StackPanel Height="Auto" Width="Auto" Grid.Column="1" HorizontalAlignment="Left" VerticalAlignment="Top" Orientation="Vertical"> <TextBlock Margin="5" Text="カラーパレットの変更" Foreground="Blue" > <TextBlock.Effect> <DropShadowEffect Color="Black" BlurRadius="5" ShadowDepth="2" Opacity="70" /> </TextBlock.Effect> </TextBlock> <ListBox x:Name="ListBox1" Grid.Column="1" Height="100" Width="120" HorizontalAlignment="Left" VerticalAlignment="Top" SelectionChanged="ListBox1_SelectionChanged" > <ListBoxItem Content="Apex" /> <ListBoxItem Content="Office" /> <ListBoxItem Content="Verve" /> <ListBoxItem Content="Metro" /> <ListBoxItem Content="リゾート" /> <ListBox.Effect> <DropShadowEffect Color="Black" BlurRadius="5" /> </ListBox.Effect> </ListBox> </StackPanel> </Grid>
以上で、Webページの作成は終了です。
処理コードの作成
C1ColorPickerコントロールで選択した色を四角形のグラデーションに反映する処理と、ListBoxのリスト項目が選択された時の処理を作成します。いずれも、MainPage.xamlのビハインドコードとして作成します。
選択色のグラデーションへの反映
C1ColorPickerコントロールで選択した色を四角形のグラデーションに反映するには、LinearGradientBrushクラスの下層にあるGradientStopクラスのColorプロパティを入れ替えます。
C1ColorPickerコントロールで選択した色は、SelectedColorプロパティに格納されているので、これをGradientStopクラスのColorプロパティに代入するだけで、四角形のグラデーション色が変更されます。
今回は、2つのC1ColorPickerコントロールで同じ処理を使うので、独自のメソッド「UpdateGradient」を作成し、ここに処理を作成します。作成したメソッド「UpdateGradient」は、それぞれのC1ColorPickerコントロールのSelectedColorChangedイベントハンドラで呼び出します。
Imports C1.Silverlight Imports C1.Silverlight.Extended Partial Public Class MainPage Private Sub UpdateGradient() If c1cp1 IsNot Nothing And c1cp2 IsNot Nothing Then Me.col1.Color = Me.c1cp1.SelectedColor Me.col2.Color = Me.c1cp2.SelectedColor End If End Sub Private Sub c1cp2_SelectedColorChanged(ByVal sender As System.Object, ByVal e As C1.Silverlight.PropertyChangedEventArgs(Of System.Windows.Media.Color)) UpdateGradient() End Sub Private Sub c1cp1_SelectedColorChanged(ByVal sender As System.Object, ByVal e As C1.Silverlight.PropertyChangedEventArgs(Of System.Windows.Media.Color)) UpdateGradient() End Sub
using C1.Silverlight; using C1.Silverlight.Extended; namespace sl_colorpicker_cs { public partial class MainPage : UserControl { public MainPage() { InitializeComponent(); } void UpdateGradient() { if (c1cp1 != null & c1cp2 != null) { this.col1.Color = this.c1cp1.SelectedColor; this.col2.Color = this.c1cp2.SelectedColor; } } private void c1cp1_SelectedColorChanged(object sender, C1.Silverlight.PropertyChangedEventArgs<Color> e) { UpdateGradient(); } private void c1cp2_SelectedColorChanged(object sender, C1.Silverlight.PropertyChangedEventArgs<Color> e) { UpdateGradient(); }
ListBoxコントロールのリスト選択の処理
ListBoxコントロールに設定したテーマのカラーパレットを、基本型C1ColorPickerコントロール「c1cp2」に組み込むには、C1ColorPickerコントロールのPaletteプロパティを使います。
このプロパティに、ColorPaletteクラスのGetColorPaletteメソッドを使って、Office2007ColorTheme列挙体のメンバを設定します。この処理は、ListBoxコントロールのSelectionChangedイベントハンドラで行います。
Private Sub ListBox1_SelectionChanged(ByVal sender As System.Object, ByVal e As System.Windows.Controls.SelectionChangedEventArgs) Select Case ListBox1.SelectedIndex Case 0 c1cp2.Palette = ColorPalette.GetColorPalette(Office2007ColorTheme.Apex) Case 1 c1cp2.Palette = ColorPalette.GetColorPalette(Office2007ColorTheme.Office) Case 2 c1cp2.Palette = ColorPalette.GetColorPalette(Office2007ColorTheme.Verve) Case 3 c1cp2.Palette = ColorPalette.GetColorPalette(Office2007ColorTheme.Metro) Case 4 c1cp2.Palette = ColorPalette.GetColorPalette(Office2007ColorTheme.Flow) End Select End Sub
private void ListBox1_SelectionChanged(object sender, SelectionChangedEventArgs e) { switch(ListBox1.SelectedIndex) { case 0: c1cp2.Palette = ColorPalette.GetColorPalette(Office2007ColorTheme.Apex); break; case 1: c1cp2.Palette = ColorPalette.GetColorPalette(Office2007ColorTheme.Office); break; case 2: c1cp2.Palette = ColorPalette.GetColorPalette(Office2007ColorTheme.Verve); break; case 3: c1cp2.Palette = ColorPalette.GetColorPalette(Office2007ColorTheme.Metro); break; case 4: c1cp2.Palette = ColorPalette.GetColorPalette(Office2007ColorTheme.Flow); break; } }
これで、リストにあるテーマを選ぶと、カラーパレットが入れ替わります。以上で完成です。
まとめ
カラーピッカーは、Webページのカラーをユーザー独自の設定にしたり、グラフィック系のアプリケーションなど対話型で色情報を扱う際に便利ですね。ColorPicker for Silverlightは、そのような機能をWebページに実装するのにもってこいのコントロールです。
参考文献
Microsoft Silverlightデベロッパーセンター