Hatena::ブログ(Diary)

Yuya Yamaki’s blog このページをアンテナに追加 RSSフィード Twitter

2009年04月15日(水曜日)

WPFとSilverlight 3 BetaにあってSilverlight 2にないシリーズ「SystemColorsクラス」

SystemColorsクラス(System.Windows名前空間)は、システムに依存した色情報を提供してくれるクラスです。Silverlight 2でこのクラスはサポートされていませんでしたが、Silverlight 3 Beta 1で追加されました。


WPFでは、1つの色につき、「Brush」、「Brushのリソースキー」、「Color」、「Colorのリソースキー」の4つの値を返す静的プロパティが用意されていますが、Silverlight 3 Beta 1では「Color」のみとなっています。また、一部の色がSilverlight 3 Beta 1にはありません。下記に比較表を掲載しておきます


WPFSilverlight 3 Beta 1
ActiveBorderColorActiveBorderColor
ActiveCaptionColorActiveCaptionColor
ActiveCaptionTextColorActiveCaptionTextColor
AppWorkspaceColorAppWorkspaceColor
ControlColorControlColor
ControlDarkColorControlDarkColor
ControlDarkDarkColorControlDarkDarkColor
ControlLightColorControlLightColor
ControlLightLightColorControlLightLightColor
ControlTextColorControlTextColor
DesktopColorDesktopColor
GradientActiveCaptionColor-
GradientInactiveCaptionColor-
GrayTextColorGrayTextColor
HighlightColorHighlightColor
HighlightTextColorHighlightTextColor
HotTrackColor-
InactiveBorderColorInactiveBorderColor
InactiveCaptionColorInactiveCaptionColor
InactiveCaptionTextColorInactiveCaptionTextColor
InfoColorInfoColor
InfoTextColorInfoTextColor
MenuBarColor-
MenuColorMenuColor
MenuHighlightColor-
MenuTextColorMenuTextColor
ScrollBarColorScrollBarColor
WindowColorWindowColor
WindowFrameColorWindowFrameColor
WindowTextColorWindowTextColor


SystemColorsクラスの各静的プロパティの値は、実行されているシステムの設定に合わせて下記のように変化します。


f:id:Yamaki:20090415110239p:image


f:id:Yamaki:20090415110238p:image


f:id:Yamaki:20090415110237p:image


f:id:Yamaki:20090415110236p:image


2009年04月10日(金曜日)

WPFとSilverlight 3 BetaにあってSilverlight 2にないシリーズ「リソースディクショナリのマージ」

以前の投稿でも取り上げました通り、Silverlight 2のResourceDictionaryクラスにはSourceプロパティとMergedDictionariesプロパティがありませんでした。Silverlight 3 Beta 1では、WPFと同様にこれら2つのプロパティがサポートされるようになったため、リソースディクショナリを外部ファイルとして使用することができるようになりました。


Visual Studioでは、まだ「新しい項目の追加」のテンプレートとしてリソース・ディクショナリが用意されていませんが、Expression Blend 3 Previewでは「New Item」にResource Dictionaryが用意されています。


f:id:Yamaki:20090410114144p:image


これを使って、リソースディクショナリを追加し、下記のように記述します。


ResourceDictionary1.xaml

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <!-- Resource dictionary entries should be defined here. -->
    <SolidColorBrush x:Key="BlueBrush" Color="Blue"/>
</ResourceDictionary>


MainPage.xaml(デフォルトがPage.xamlから変更になりましたね)は次のように記述します。


MainPage.xaml

<UserControl x:Class="SilverlightApplication1.MainPage"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   Width="300" Height="300">
    <UserControl.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="ResourceDictionary1.xaml"/>
                <ResourceDictionary>
                    <SolidColorBrush x:Key="RedBrush" Color="Red"/>
                </ResourceDictionary>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </UserControl.Resources>
    <Grid x:Name="LayoutRoot" Background="White">
        <Border Background="{StaticResource BlueBrush}"
               BorderBrush="{StaticResource RedBrush}" BorderThickness="50"/>
    </Grid>
</UserControl>


そして忘れてはいけないのは、ResourceDictionary1.xamlファイルのビルドアクションを「Resource」に変更することです。

ビルドアクションは「Page」と「Resource」のどちらでも問題なく参照できます。WPFでは「Page」の場合にはBAMLとして埋め込まれ、「Resource」の場合にはそのままXAMLが埋め込まれるという違いがありますが、Silverlightではどちらの場合でもXAMLで埋め込まれます。


f:id:Yamaki:20090410115244p:image


実行すると、WPFと同じ使用方法で外部のリソースディクショナリファイルをマージできていることが確認できます。


f:id:Yamaki:20090410115537p:image


2009年04月02日(木曜日)

WPFとSilverlight 3 BetaにあってSilverlight 2にないシリーズ「Styleプロパティに値を2回以上設定する」

XAML

<Grid>
    <Rectangle x:Name="BackgroundRect"/>
    <Button VerticalAlignment="Center" HorizontalAlignment="Center"
           Content="スタイルの適用" Click="Button_Click"/>       
</Grid>


Visual Basic

Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
    Dim MyStyle As New Style(GetType(Rectangle))
    MyStyle.Setters.Add(New Setter(Rectangle.FillProperty, New SolidColorBrush(Colors.Blue)))
    BackgroundRect.Style = MyStyle
End Sub


上記のようなXAMLとコードを記述し、実行してからボタンを2回押した場合、Silverlight 2では下記のようなExceptionが発生しますが、WPFとSilverlight 3 Betaでは発生しません。


f:id:Yamaki:20090402154053p:image


Silverlight 2ではStyleプロパティは1回しか値を設定できないという制限があったため、実行時に異なるスタイルを適用するということができませんでした。苦肉の策として動的にコントロールを生成しなおして新しいスタイルを設定するという方法が、ToolkitのThemeサンプルなどでは使われていました。


今回Silverlight 3 Betaでこの制限がなくなり、WPF同様に何回でもスタイルを設定できるようになっています。