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を手で修正するのはなかなか大変です。