Стиль для круглой кнопки
29 декабря 2009 - 19:22
В Window Vista (а также судя по бета версии и в Windows 7) кнопка "Пуск" перестала выглядеть как унылый прямоугольник, и стала красивой круглой. Также аналогичная кругла кнопка была использована в Windows Media Player, в Windows Photo Viewer , в Windows Live Gallery и, с другой расцветкой, в Microsoft Office 2007.
Реализовать аналогичную кнопку в WPF достаточно легко.
Для данного примера я использова те же цвета, что и в той версии Windows Medial Player, которая была представлена вместе с бетой Windows 7, для Windows Vista они могут отличаться.
Итак, для начала возьмём эллипс с градиентной заливкой и однородным бордером:
Сверху поместим path специфической формы (наиболее простой способ получить такую форму - обрисовать скриншот в Expression Blend):
Данный path должен занимать примерно 55-56% от высоты всего контрола, поэтому для корневого grid`а зададим следующие размеры строк:
Теперь сверху поместим ещё один эллипс, который будет представлять собой внутрений бордер:
Теперь добавляем ContentPresenter:
И основная часть работы завершена. Осталось только сделать обработку наведения мыши и нажатия кнопки. Для этого в самый низ добавим ещё один эллипс с полупрозрачным радиальным градиентом, который будет служить подсветкой при наведении/нажатии:
Теперь добавляем триггеры для событий мыши:
И всё, стиль для круглой кнопки готов.
Скачать исходники:
Реализовать аналогичную кнопку в WPF достаточно легко.
Для данного примера я использова те же цвета, что и в той версии Windows Medial Player, которая была представлена вместе с бетой Windows 7, для Windows Vista они могут отличаться.
Итак, для начала возьмём эллипс с градиентной заливкой и однородным бордером:
<Ellipse Margin="2,2,2,2" StrokeThickness="1.5" x:Name="ellipse" Grid.RowSpan="2"> <Ellipse.Fill> <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0" MappingMode="RelativeToBoundingBox"> <GradientStop Color="#FFA3B0D8" Offset="0"/> <GradientStop Color="#FF5F8BC3" Offset="0.444"/> </LinearGradientBrush> </Ellipse.Fill> <Ellipse.Stroke> <LinearGradientBrush EndPoint="0.505,1" StartPoint="0.495,0"> <GradientStop Color="#FF485EA4" Offset="1"/> <GradientStop Color="#FF485EA4" Offset="0"/> </LinearGradientBrush> </Ellipse.Stroke> </Ellipse>
<Path Margin="4,0,4,4" Stretch="Uniform" StrokeThickness="0" Data="M4.0973642,44.617 C12.256034,49.602413 13.93001,38.587614 45.001306,38.781983 76.427898,38.978575 77.268608,49.183727 86.132746,43.809973 86.393574,43.65185 87.77373,62.552321 73.046597,74.974389 56.040774,89.318491 35.10706,88.493983 20.113414,77.486464 1.7395959,63.997406 4.0322094,44.577187 4.0973642,44.617 z" x:Name="path" Width="Auto" Height="Auto" VerticalAlignment="Stretch" Grid.Row="1"> <Path.Fill> <RadialGradientBrush GradientOrigin="0.501,0.691" RadiusY="1.014"> <RadialGradientBrush.RelativeTransform> <TransformGroup> <ScaleTransform CenterX="0.5" CenterY="0.5" ScaleX="1" ScaleY="1.435"/> <SkewTransform AngleX="0" AngleY="0" CenterX="0.5" CenterY="0.5"/> <RotateTransform Angle="0" CenterX="0.5" CenterY="0.5"/> <TranslateTransform X="-0.002" Y="0.216"/> </TransformGroup> </RadialGradientBrush.RelativeTransform> <GradientStop Color="#FF47CBFA" Offset="0"/> <GradientStop Color="#FF163893" Offset="1"/> </RadialGradientBrush> </Path.Fill> <Path.Stroke> <LinearGradientBrush EndPoint="0.505,1" StartPoint="0.495,0"> <GradientStop Color="#FF000D61" Offset="0"/> <GradientStop Color="#FF819DFF" Offset="1"/> </LinearGradientBrush> </Path.Stroke> </Path>
<Grid.RowDefinitions> <RowDefinition Height="0.44*"/> <RowDefinition Height="0.56*"/> </Grid.RowDefinitions>
<Ellipse Margin="3,3,3,3" StrokeThickness="1.5" x:Name="ellipse_Copy" Fill="{x:Null}" Grid.RowSpan="2"> <Ellipse.Stroke> <LinearGradientBrush EndPoint="0.505,1" StartPoint="0.495,0"> <GradientStop Color="#FFA2F6FF" Offset="1"/> <GradientStop Color="#FFD3D8ED" Offset="0"/> <GradientStop Color="#FF5D7FC2" Offset="0.487"/> <GradientStop Color="#FF193095" Offset="0.5"/> </LinearGradientBrush> </Ellipse.Stroke> </Ellipse>
<ContentPresenter HorizontalAlignment="Center" Margin="5" VerticalAlignment="Center" Grid.RowSpan="2"/>
<Ellipse HorizontalAlignment="Stretch" Margin="-2,-2,-2,-2" Width="Auto" StrokeThickness="0" x:Name="hightlightCircle" Opacity="1" Visibility="Collapsed" Grid.RowSpan="2"> <Ellipse.Fill> <RadialGradientBrush> <GradientStop Color="#FF000A4B" Offset="0"/> <GradientStop Color="#1961B6E3" Offset="1"/> <GradientStop Color="#FF61B6E3" Offset="0.85"/> </RadialGradientBrush> </Ellipse.Fill> <Ellipse.Stroke> <LinearGradientBrush EndPoint="1,0.5" StartPoint="0,0.5"> <GradientStop Color="#FF000000" Offset="0"/> <GradientStop Color="#FFFFFFFF" Offset="1"/> </LinearGradientBrush> </Ellipse.Stroke> </Ellipse>
<ControlTemplate.Triggers> <MultiTrigger> <MultiTrigger.Conditions> <Condition Property="IsMouseOver" Value="True"/> <Condition Property="IsPressed" Value="False"/> </MultiTrigger.Conditions> <Setter Property="Visibility" TargetName="hightlightCircle" Value="Visible"/> <Setter Property="Stroke" TargetName="ellipse_Copy"> <Setter.Value> <LinearGradientBrush EndPoint="0.505,1" StartPoint="0.495,0"> <GradientStop Color="#FFD3FFFF" Offset="1"/> <GradientStop Color="#FFCDE2F2" Offset="0"/> <GradientStop Color="#FF6AA9DA" Offset="0.487"/> <GradientStop Color="#FF246AB5" Offset="0.5"/> </LinearGradientBrush> </Setter.Value> </Setter> <Setter Property="Stroke" TargetName="ellipse"> <Setter.Value> <LinearGradientBrush EndPoint="0.505,1" StartPoint="0.495,0"> <GradientStop Color="#FF3485C2" Offset="1"/> <GradientStop Color="#FF69C5F1" Offset="0"/> </LinearGradientBrush> </Setter.Value> </Setter> <Setter Property="Fill" TargetName="ellipse"> <Setter.Value> <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0" MappingMode="RelativeToBoundingBox"> <GradientStop Color="#FF9EC0E1" Offset="0"/> <GradientStop Color="#FF58A0D6" Offset="0.444"/> </LinearGradientBrush> </Setter.Value> </Setter> <Setter Property="Fill" TargetName="path"> <Setter.Value> <RadialGradientBrush GradientOrigin="0.501,0.691" RadiusY="1.014"> <RadialGradientBrush.RelativeTransform> <TransformGroup> <ScaleTransform CenterX="0.5" CenterY="0.5" ScaleX="1" ScaleY="1.435"/> <SkewTransform AngleX="0" AngleY="0" CenterX="0.5" CenterY="0.5"/> <RotateTransform Angle="0" CenterX="0.5" CenterY="0.5"/> <TranslateTransform X="-0.002" Y="0.216"/> </TransformGroup> </RadialGradientBrush.RelativeTransform> <GradientStop Color="#FF7CF0FC" Offset="0"/> <GradientStop Color="#FF105399" Offset="1"/> </RadialGradientBrush> </Setter.Value> </Setter> </MultiTrigger> <Trigger Property="IsPressed" Value="True"> <Setter Property="Visibility" TargetName="hightlightCircle" Value="Visible"/> <Setter Property="Stroke" TargetName="ellipse_Copy"> <Setter.Value> <LinearGradientBrush EndPoint="0.505,1" StartPoint="0.495,0"> <GradientStop Color="#FF51BDE9" Offset="1"/> <GradientStop Color="#FFA4AFBC" Offset="0"/> <GradientStop Color="#FF627A94" Offset="0.487"/> <GradientStop Color="#FF344262" Offset="0.5"/> </LinearGradientBrush> </Setter.Value> </Setter> <Setter Property="Stroke" TargetName="ellipse"> <Setter.Value> <LinearGradientBrush EndPoint="0.505,1" StartPoint="0.495,0"> <GradientStop Color="#FF245379" Offset="1"/> <GradientStop Color="#FF6CC6EF" Offset="0"/> </LinearGradientBrush> </Setter.Value> </Setter> <Setter Property="Fill" TargetName="ellipse"> <Setter.Value> <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0" MappingMode="RelativeToBoundingBox"> <GradientStop Color="#FF8993A3" Offset="0"/> <GradientStop Color="#FF5B7998" Offset="0.444"/> </LinearGradientBrush> </Setter.Value> </Setter> <Setter Property="Fill" TargetName="path"> <Setter.Value> <RadialGradientBrush GradientOrigin="0.501,0.691" RadiusY="1.014"> <RadialGradientBrush.RelativeTransform> <TransformGroup> <ScaleTransform CenterX="0.5" CenterY="0.5" ScaleX="1" ScaleY="1.435"/> <SkewTransform AngleX="0" AngleY="0" CenterX="0.5" CenterY="0.5"/> <RotateTransform Angle="0" CenterX="0.5" CenterY="0.5"/> <TranslateTransform X="-0.002" Y="0.216"/> </TransformGroup> </RadialGradientBrush.RelativeTransform> <GradientStop Color="#FF54D1FE" Offset="0"/> <GradientStop Color="#FF192E54" Offset="1"/> </RadialGradientBrush> </Setter.Value> </Setter> </Trigger> </ControlTemplate.Triggers>
Скачать исходники: