WPF テンプレ

WPFのボタン用テンプレート3種。

<Window.Resources>
  <ControlTemplate x:Key="BtnTmplElp1" TargetType="{x:Type Button}">
    <Grid Loaded="BtnTmplElp1_Grid_Loaded">
      <Ellipse RenderTransformOrigin="0.4 0.4">
        <Ellipse.RenderTransform>
          <TransformGroup>
            <ScaleTransform ScaleX="1.05" ScaleY="1.05"/>
            <TranslateTransform X="2" Y="2"/>
          </TransformGroup>
        </Ellipse.RenderTransform>
        <Ellipse.Fill>
          <RadialGradientBrush>
            <GradientStop Color="Black" Offset="0.7"/>
            <GradientStop Color="White" Offset="1"/>
          </RadialGradientBrush>
        </Ellipse.Fill>
      </Ellipse>
      <Grid x:Name="BtnTmplElp1Grid" RenderTransformOrigin="0.5,0.5">
        <Grid.RenderTransform>
          <TranslateTransform X="0" Y="0"/>
        </Grid.RenderTransform>
        <Ellipse>
          <Ellipse.Fill>
            <RadialGradientBrush GradientOrigin="0.5,0.7">
              <GradientStop Color="#A0A0FF" Offset="0"/>
              <GradientStop Color="#273367" Offset="1"/>
            </RadialGradientBrush>
          </Ellipse.Fill>
        </Ellipse>
        <Ellipse Margin="4 0 4 24">
          <Ellipse.Fill>
            <RadialGradientBrush GradientOrigin="0.5,0.36">
              <GradientStop Color="#80FFFFFF" Offset="0.4"/>
              <GradientStop Color="#1071AB5C" Offset="1"/>
              <GradientStop Color="#FFFFFFFF" Offset="0"/>
            </RadialGradientBrush>
          </Ellipse.Fill>
        </Ellipse>
        <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" RecognizesAccessKey="True"
Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
      </Grid>
    </Grid>
    <ControlTemplate.Resources>
      <Storyboard x:Key="BtnTmplElp1OnPreviewMouseLeftButtonDown">
        <DoubleAnimationUsingKeyFrames BeginTime="0:0:0" Storyboard.TargetName="BtnTmplElp1Grid" Storyboard.TargetProperty="RenderTransform.(TranslateTransform.X)">
          <SplineDoubleKeyFrame KeyTime="0:0:0.1" Value="5"/>
        </DoubleAnimationUsingKeyFrames>
        <DoubleAnimationUsingKeyFrames BeginTime="0:0:0" Storyboard.TargetName="BtnTmplElp1Grid" Storyboard.TargetProperty="RenderTransform.(TranslateTransform.Y)">
          <SplineDoubleKeyFrame KeyTime="0:0:0.1" Value="5"/>
        </DoubleAnimationUsingKeyFrames>
      </Storyboard>
      <Storyboard x:Key="BtnTmplElp1OnPreviewMouseLeftButtonUp">
        <DoubleAnimationUsingKeyFrames BeginTime="0:0:0" Storyboard.TargetName="BtnTmplElp1Grid" Storyboard.TargetProperty="RenderTransform.(TranslateTransform.X)">
          <SplineDoubleKeyFrame KeyTime="0:0:0.1" Value="0"/>
        </DoubleAnimationUsingKeyFrames>
        <DoubleAnimationUsingKeyFrames BeginTime="0:0:0" Storyboard.TargetName="BtnTmplElp1Grid" Storyboard.TargetProperty="RenderTransform.(TranslateTransform.Y)">
          <SplineDoubleKeyFrame KeyTime="0:0:0.1" Value="0"/>
        </DoubleAnimationUsingKeyFrames>
      </Storyboard>
    </ControlTemplate.Resources>
    <ControlTemplate.Triggers>
      <EventTrigger RoutedEvent="UIElement.PreviewMouseLeftButtonDown">
        <BeginStoryboard Storyboard="{StaticResource BtnTmplElp1OnPreviewMouseLeftButtonDown}"/>
      </EventTrigger>
      <EventTrigger RoutedEvent="UIElement.PreviewMouseLeftButtonUp">
        <BeginStoryboard Storyboard="{StaticResource BtnTmplElp1OnPreviewMouseLeftButtonUp}"/>
      </EventTrigger>
    </ControlTemplate.Triggers>
  </ControlTemplate>
  <x:Code>
    <![CDATA[  
private void BtnTmplElp1_Grid_Loaded(object sender, RoutedEventArgs e)
{
var gr = sender as Grid;
var gr2 = gr.Children[1] as Grid;
var btn = gr.TemplatedParent as Button;
var el1 = gr.Children[0] as Ellipse;
double d = Math.Min(gr.ActualWidth, gr.ActualHeight);
el1.Margin = new Thickness(0, 0, d / 20, 0);
var tg = (el1.RenderTransform as TransformGroup).CloneCurrentValue();
tg.Children[1] = new TranslateTransform(d / 12, d / 12);
el1.RenderTransform = tg;
var el2 = gr2.Children[0] as Ellipse;
var br = el2.Fill.CloneCurrentValue() as RadialGradientBrush;
Color c1 = ((SolidColorBrush)btn.Background).Color;
Color c2 = Color.FromRgb((byte)(c1.R / 2), (byte)(c1.G / 2), (byte)(c1.B / 2));
br.GradientStops[0] = new GradientStop(c1, 0);
br.GradientStops[1] = new GradientStop(c2, 1);
el2.Fill = br;
var el3 = gr2.Children[1] as Ellipse;
el3.Margin = new Thickness(d / 15, 0, d / 15, d * 0.4);
}
]]>
  </x:Code>
  <ControlTemplate x:Key="BtnTmplElp2" TargetType="{x:Type Button}">
    <Grid Loaded="BtnTmplElp2_Grid_Loaded">
      <Rectangle Stroke="#FF111E4D" RadiusX="40" RadiusY="40">
        <Rectangle.Fill>
          <RadialGradientBrush  GradientOrigin="0.5,0.7">
            <GradientStop Color="#FFB6D0FF" Offset="0"/>
            <GradientStop Color="#FF6083dC" Offset="0.75"/>
            <GradientStop Color="#FF0043BC" Offset="1"/>
          </RadialGradientBrush>
        </Rectangle.Fill>
      </Rectangle>
      <Rectangle RadiusX="40" RadiusY="40" Margin="25,7,25,0" Height="24" VerticalAlignment="Top">
        <Rectangle.Fill>
          <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
            <GradientStop Color="#A0FFC0C0" Offset="0"/>
            <GradientStop Color="#10FFFFFF" Offset="0.7"/>
          </LinearGradientBrush>
        </Rectangle.Fill>
      </Rectangle>
      <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" RecognizesAccessKey="True"
Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
      <Rectangle x:Name="BtnTmplElp2Rect" Fill="Black" Opacity="0"/>
    </Grid>
    <ControlTemplate.Resources>
      <Storyboard x:Key="BtnTmplElp2OnPreviewMouseLeftButtonDown">
        <DoubleAnimation Duration="00:00:00.1" Storyboard.TargetName="BtnTmplElp2Rect" Storyboard.TargetProperty="Opacity" To="0.2"/>
      </Storyboard>
      <Storyboard x:Key="BtnTmplElp2OnPreviewMouseLeftButtonUp">
        <DoubleAnimation Duration="00:00:00.1" Storyboard.TargetName="BtnTmplElp2Rect" Storyboard.TargetProperty="Opacity" To="0"/>
      </Storyboard>
    </ControlTemplate.Resources>
    <ControlTemplate.Triggers>
      <EventTrigger RoutedEvent="UIElement.PreviewMouseLeftButtonDown">
        <BeginStoryboard Storyboard="{StaticResource BtnTmplElp2OnPreviewMouseLeftButtonDown}"/>
      </EventTrigger>
      <EventTrigger RoutedEvent="UIElement.PreviewMouseLeftButtonUp">
        <BeginStoryboard Storyboard="{StaticResource BtnTmplElp2OnPreviewMouseLeftButtonUp}"/>
      </EventTrigger>
    </ControlTemplate.Triggers>
  </ControlTemplate>
  <x:Code>
<![CDATA[
private void BtnTmplElp2_Grid_Loaded(object sender, RoutedEventArgs e)
{
var gr = sender as Grid;
double d = Math.Min(gr.ActualWidth, gr.ActualHeight);
var re1 = gr.Children[0] as Rectangle;
var re3 = gr.Children[3] as Rectangle;
re1.RadiusX = re1.RadiusY = re3.RadiusX = re3.RadiusY = d * 0.4;
var br1 = re1.Fill.CloneCurrentValue() as RadialGradientBrush;
var btn = gr.TemplatedParent as Button;
var sc = btn.Background as SolidColorBrush;
Color c1 = sc != null ? sc.Color : SystemColors.WindowFrameColor;
Color c2 = Color.FromRgb((byte)(c1.R * 0.75), (byte)(c1.G * 0.75), (byte)(c1.B * 0.75));
Color c3 = Color.FromRgb((byte)(c1.R * 0.5), (byte)(c1.G * 0.5), (byte)(c1.B * 0.5));
br1.GradientStops[0] = new GradientStop(c1, 0);
br1.GradientStops[1] = new GradientStop(c2, 0.7);
br1.GradientStops[2] = new GradientStop(c3, 1);
re1.Fill = br1;
var re2 = gr.Children[1] as Rectangle;
re2.RadiusX = re2.RadiusY = d * 0.4;
re2.Height = d * 0.24;
re2.Margin = new Thickness(d * 0.24, d * 0.08, d * 0.24, 0);
var br2 = re2.Fill.CloneCurrentValue() as LinearGradientBrush;
Color c4 = Color.FromArgb(160, (byte)(c1.R * 0.2 + 204), (byte)(c1.G * 0.2 + 204), (byte)(c1.B * 0.2 + 204));
br2.GradientStops[0] = new GradientStop(c4, 0);
br2.GradientStops[1] = new GradientStop(Color.FromArgb(16,255,255,255), 0.7);
}
]]>
  </x:Code>
  <ControlTemplate x:Key="BtnTmplElp3" TargetType="{x:Type Button}">
    <Grid Loaded="BtnTmplElp3_Grid_Loaded">
      <Ellipse Stroke="#FF2C3366">
        <Ellipse.Fill>
          <LinearGradientBrush EndPoint="0.909,-0.085" StartPoint="0.1,1">
            <GradientStop Color="#F03D71CE" Offset="0.0"/>
            <GradientStop Color="#F7CFD9EB" Offset="0.5"/>
            <GradientStop Color="#FF0F3F97" Offset="1"/>
          </LinearGradientBrush>
        </Ellipse.Fill>
      </Ellipse>
      <Ellipse Margin="8,8,8,8">
        <Ellipse.Fill>
          <LinearGradientBrush EndPoint="0.3,1.5" StartPoint="0.7,-0.4">
            <GradientStop Color="#F03D71CE" Offset="0.0"/>
            <GradientStop Color="#F7CFD9EB" Offset="0.5"/>
            <GradientStop Color="#FF0F3F97" Offset="1"/>
          </LinearGradientBrush>
        </Ellipse.Fill>
      </Ellipse>
      <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" RecognizesAccessKey="True"
Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
      <Ellipse x:Name="BtnTmplElp3Elps" Fill="Black" Opacity="0"/>
    </Grid>
    <ControlTemplate.Resources>
      <Storyboard x:Key="BtnTmplElp3OnPreviewMouseLeftButtonDown">
        <DoubleAnimation Duration="00:00:00.1" Storyboard.TargetName="BtnTmplElp3Elps" Storyboard.TargetProperty="Opacity" To="0.2"/>
      </Storyboard>
      <Storyboard x:Key="BtnTmplElp3OnPreviewMouseLeftButtonUp">
        <DoubleAnimation Duration="00:00:00.1" Storyboard.TargetName="BtnTmplElp3Elps" Storyboard.TargetProperty="Opacity" To="0"/>
      </Storyboard>
    </ControlTemplate.Resources>
    <ControlTemplate.Triggers>
      <EventTrigger RoutedEvent="UIElement.PreviewMouseLeftButtonDown">
        <BeginStoryboard Storyboard="{StaticResource BtnTmplElp3OnPreviewMouseLeftButtonDown}"/>
      </EventTrigger>
      <EventTrigger RoutedEvent="UIElement.PreviewMouseLeftButtonUp">
        <BeginStoryboard Storyboard="{StaticResource BtnTmplElp3OnPreviewMouseLeftButtonUp}"/>
      </EventTrigger>
    </ControlTemplate.Triggers>
  </ControlTemplate>
  <x:Code>
<![CDATA[
private void BtnTmplElp3_Grid_Loaded(object sender, RoutedEventArgs e)
{
var gr = sender as Grid;
double d = Math.Min(gr.ActualWidth, gr.ActualHeight);
var btn = gr.TemplatedParent as Button;
var el1 = gr.Children[0] as Ellipse;
var el2 = gr.Children[1] as Ellipse;
el2.Margin = new Thickness(d * 0.12);
var br1 = el1.Fill.CloneCurrentValue() as LinearGradientBrush;
var br2 = el2.Fill.CloneCurrentValue() as LinearGradientBrush;
var sc = btn.Background as SolidColorBrush;
Color c1 = sc != null ? sc.Color : SystemColors.WindowFrameColor;
Color c2 = Color.FromRgb((byte)(c1.R * 0.3 + 180), (byte)(c1.G * 0.3 + 180), (byte)(c1.B * 0.3 + 180));
br1.GradientStops[0] = br2.GradientStops[0] = new GradientStop(c1, 0);
br1.GradientStops[1] = br2.GradientStops[1] = new GradientStop(c2, 0.5);
br1.GradientStops[2] = br2.GradientStops[2] = new GradientStop(c1, 1);
el1.Fill = br1;
el2.Fill = br2;
}
]]></x:Code>
</Window.Resources>