Style を使用してUIを変更します。[WPF] StyleとTemplateを使用してWPFのButtonとProgressBarのUIを変更する
でも紹介しましたが、覚書として掲載します。
動作確認環境
- 確認環境: Windows Server 2003
- 開発環境:Visual Studio 2008 Professional
- .NET 3.5
1. 今回作成するボタン
青いボタンをいろいろ作ります。以下に動作サンプルを掲載します。

2. カスタマイズボタンを作成する
ボタンを作るには、まずVisual Studio でソリューションを作成後、WPFアプリケーションを作成します。ソリューションエクスプローラからプロジェクトを右クリックし追加→リソースディクショナリで、各4つのボタンのリソースディクショナリファイルを作成します。
2.1 btnSample1のリソースディクショナリの作成
BlueButton1.xamlという名前でリソースディクショナリを作成し、次のように編集しました。
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <SolidColorBrush x:Key="TextBrush" Color="White" /> <LinearGradientBrush x:Key="BlueFill" StartPoint="0,0" EndPoint="0,1"> <GradientStop Offset="0" Color="Blue" /> <GradientStop Offset="1" Color="DarkBlue" /> </LinearGradientBrush> <LinearGradientBrush x:Key="BlueStroke" StartPoint="0,0" EndPoint="0,1"> <GradientStop Offset="0" Color="Black" /> <GradientStop Offset="1" Color="LightGray" /> </LinearGradientBrush> <LinearGradientBrush x:Key="BlueLightFillTop" StartPoint="0,0" EndPoint="0,1"> <GradientStop Offset="0" Color="#FFadd8e6" /> <GradientStop Offset="1" Color="#00add8e6" /> </LinearGradientBrush> <RadialGradientBrush x:Key="BlueLightFillButtom" GradientOrigin="0.5,1.0" Center="0.5,1.0" RadiusX="0.7" RadiusY="0.2"> <RadialGradientBrush.GradientStops> <GradientStop Color="LightBlue" Offset="0" /> <GradientStop Color="#00FFFFFF" Offset="1" /> </RadialGradientBrush.GradientStops> </RadialGradientBrush> <Style x:Key="BlueButton1" TargetType="{x:Type Button}"> <Setter Property="Foreground" Value="{StaticResource TextBrush}" /> <Setter Property="MinHeight" Value="26"></Setter> <Setter Property="MinWidth" Value="80"></Setter> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="Button"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="2*" /> <RowDefinition Height="*" /> </Grid.RowDefinitions> <Rectangle Grid.RowSpan="2" RadiusX="13" RadiusY="13" Fill="{StaticResource BlueFill}" Stroke="{StaticResource BlueStroke}" /> <Rectangle Margin="3,2" RadiusX="8" RadiusY="12" Fill="{StaticResource BlueLightFillTop}" /> <Rectangle Grid.RowSpan="2" Margin="3,2" RadiusX="8" RadiusY="12" Fill="{StaticResource BlueLightFillButtom}" /> <ContentPresenter Grid.RowSpan="2" Margin="3" x:Name="Conent" VerticalAlignment="Center" HorizontalAlignment="Center" /> </Grid> </ControlTemplate> </Setter.Value> </Setter> </Style> </ResourceDictionary>
2.2 btnSample2のリソースディクショナリの作成
BlueButton2.xamlというファイル名でリソースディクショナリを作成し、次のように編集しました。
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <SolidColorBrush x:Key="TextBrush" Color="White" /> <LinearGradientBrush x:Key="BlueFill" StartPoint="0,0" EndPoint="0,1"> <GradientStop Offset="0" Color="Blue" /> <GradientStop Offset="1" Color="DarkBlue" /> </LinearGradientBrush> <LinearGradientBrush x:Key="BlueStroke" StartPoint="0,0" EndPoint="0,1"> <GradientStop Offset="0" Color="Black" /> <GradientStop Offset="1" Color="Gray" /> </LinearGradientBrush> <LinearGradientBrush x:Key="BlueLightFill" StartPoint="0,0" EndPoint="0,1"> <GradientStop Offset="0" Color="#DDFFFFFF" /> <GradientStop Offset="1" Color="#00FFFFFF" /> </LinearGradientBrush> <Style x:Key="BlueButton2" TargetType="{x:Type Button}"> <Setter Property="Foreground" Value="{StaticResource TextBrush}" /> <Setter Property="MinHeight" Value="26"></Setter> <Setter Property="MinWidth" Value="80"></Setter> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="Button"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="2*" /> <RowDefinition Height="*" /> </Grid.RowDefinitions> <Rectangle Grid.RowSpan="2" RadiusX="13" RadiusY="13" Fill="{StaticResource BlueFill}" Stroke="{StaticResource BlueStroke}" /> <Rectangle Margin="3,2" RadiusX="8" RadiusY="12" Fill="{StaticResource BlueLightFill}" /> <ContentPresenter Grid.RowSpan="2" Margin="3" x:Name="Conent" VerticalAlignment="Center" HorizontalAlignment="Center" /> </Grid> </ControlTemplate> </Setter.Value> </Setter> </Style> </ResourceDictionary>
2.3 丸型ボタンのリソースディディクショナリの作成
EllipseBlueButton.xamlというファイル名でリソースディクショナリを作成し、次のように編集します。
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <SolidColorBrush x:Key="TextBrush" Color="White" /> <Style x:Key="EllipseBlueButton" TargetType="{x:Type Button}"> <Setter Property="Foreground" Value="{StaticResource TextBrush}" /> <Setter Property="MinHeight" Value="30"></Setter> <Setter Property="MinWidth" Value="30"></Setter> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="Button"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="*" /> <ColumnDefinition Width="10*" /> <ColumnDefinition Width="*" /> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="*" /> <RowDefinition Height="10*" /> <RowDefinition Height="3*" /> </Grid.RowDefinitions> <Ellipse Grid.RowSpan="3" Grid.ColumnSpan="3" Margin="0.5"> <Ellipse.Fill> <RadialGradientBrush Center="0.5,0.9" RadiusX="0.7" RadiusY="0.5"> <GradientStop Offset="0" Color="#F8cf" /> <GradientStop Offset="1" Color="Blue" /> </RadialGradientBrush> </Ellipse.Fill> </Ellipse> <Ellipse Grid.Row="1" Grid.Column="1"> <Ellipse.Fill> <RadialGradientBrush Center="0.5,0.1" GradientOrigin="0.5,0.4" RadiusX="0.7" RadiusY="0.5"> <RadialGradientBrush.GradientStops> <GradientStop Color="#F8cf" Offset="0" /> <GradientStop Offset="1.0" Color="Transparent" /> </RadialGradientBrush.GradientStops> </RadialGradientBrush> </Ellipse.Fill> </Ellipse> <Ellipse Grid.RowSpan="3" Grid.ColumnSpan="3"> <Ellipse.Stroke> <LinearGradientBrush StartPoint="0,0" EndPoint="0,1"> <GradientStop Offset="0" Color="Gray" /> <GradientStop Offset="1" Color="LightGray" /> </LinearGradientBrush> </Ellipse.Stroke> </Ellipse> </Grid> </ControlTemplate> </Setter.Value> </Setter> </Style> </ResourceDictionary>
2.4 btnSample4のリソースディクショナリの作成
BlueButton3.xamlというファイル名でリソースディクショナリを作成し次のように編集します。
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <SolidColorBrush x:Key="TextBrush" Color="White" /> <Style x:Key="ForcusDefaultStyle" TargetType="{x:Type Control}" > </Style> <Style x:Key="BlueButton3" TargetType="{x:Type Button}"> <Setter Property="Background" Value="CornflowerBlue" /> <Setter Property="FocusVisualStyle" Value="{StaticResource ForcusDefaultStyle}" /> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type Button}"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="1.8*" /> <RowDefinition Height="*" /> </Grid.RowDefinitions> <Rectangle Grid.RowSpan="2" RadiusX="13" RadiusY="13" Fill="{TemplateBinding Background}"> <Rectangle.Stroke> <LinearGradientBrush StartPoint="0,0" EndPoint="0,1"> <GradientStop Offset="0" Color="Black" /> <GradientStop Offset="1" Color="LightGray" /> </LinearGradientBrush> </Rectangle.Stroke> </Rectangle> <Rectangle x:Name="press" Grid.RowSpan="2" RadiusX="13" RadiusY="13" Visibility="Hidden"> <Rectangle.Fill> <RadialGradientBrush Center="0.5, 1" RadiusX="0.7" RadiusY="0.8"> <GradientStop Offset="0" Color="White"/> <GradientStop Offset="1" Color="Transparent" /> </RadialGradientBrush> </Rectangle.Fill> </Rectangle> <Rectangle Margin="3,1.1" RadiusX="11" RadiusY="12" > <Rectangle.Fill> <LinearGradientBrush StartPoint="0,0" EndPoint="0,1"> <GradientStop Offset="0" Color="#dfff" /> <GradientStop Offset="1" Color="#0fff" /> </LinearGradientBrush> </Rectangle.Fill> </Rectangle> <ContentPresenter Grid.RowSpan="3" Margin="3" HorizontalAlignment="Center" VerticalAlignment="Center" /> </Grid> <ControlTemplate.Triggers> <Trigger Property="IsPressed" Value="True"> <Setter TargetName="press" Property="Visibility" Value="Visible" /> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> </ResourceDictionary>
2.5 ユーザコントロールの作成
プロジェクトにWPFユーザコントロールを追加します。ファイル名はUserControl2とします。
<UserControl x:Class="WPFGlass.UserControl2" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" > <UserControl.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="BlueButton1.xaml"/> <ResourceDictionary Source="BlueButton2.xaml"/> <ResourceDictionary Source="EllipseBlueButton.xaml"/> <ResourceDictionary Source="BlueButton3.xaml"/> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </UserControl.Resources> <StackPanel Margin="3"> <Button Style="{StaticResource BlueButton1}" x:Name="btnSample1" Content="btnSample1" /> <Button Style="{StaticResource BlueButton2}" x:Name="btnSample2" Content="btnSample2" /> <Button Style="{StaticResource EllipseBlueButton}" x:Name="btnSample3" Content="btnSample3" Width="140" Height="140" /> <Button Style="{StaticResource BlueButton3}" x:Name="btnSample4" Content="btnSample4" Height="26" /> </StackPanel> </UserControl>
2.6 アプリケーションの作成
WPFアプリケーションプロジェクト作成時に既定で作成されるWindows1.xaml.csを次のように編集します。編集後、プログラムを実行して、UIを確認します。
<Window x:Class="WpfApplication1.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:custom="clr-namespace:WPFGlass;assembly=WPFGlass" Title="Window1" > <Grid> <custom:UserControl2 x:Name="userControl" /> </Grid> </Window>
3. おわりに
説明は以上です。UIは凝ると大変です。Expression Blend がどれくらい使えるか分からないですがStyleを手で修正するのはなかなか大変です。
さんのコメント: さんのコメント: