WPF开发者QQ群: 340500857 | 微信群 -> 进入公众号主页 加入组织
由于微信群人数太多入群请添加小编微信号
(yanjinhuawechat)或(W_Feng_aiQ)邀请入群
(需备注WPF开发者)
PS:有更好的方式欢迎推荐。
01
—
代码如下
一、创建 BreathLamp.cs 继承 ContentControl代码如下。
using System.Windows;
using System.Windows.Controls;
namespace WPFDevelopers.Controls
{
public enum LampEffect
{
OuterGlow,
Eclipse,
Ripple,
Streamer
}
public class BreathLamp : ContentControl
{
static BreathLamp()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(BreathLamp), new FrameworkPropertyMetadata(typeof(BreathLamp)));
}
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
}
public static readonly DependencyProperty CornerRadiusProperty =
DependencyProperty.Register("CornerRadius", typeof(CornerRadius), typeof(BreathLamp), new PropertyMetadata(new CornerRadius(60d)));
public static readonly DependencyProperty LampEffectProperty =
DependencyProperty.Register("LampEffect", typeof(LampEffect), typeof(BreathLamp), new PropertyMetadata(default(LampEffect), OnLampEffectPropertyChangedCallBack));
public static readonly DependencyProperty IsLampStartProperty =
DependencyProperty.Register("IsLampStart", typeof(bool), typeof(BreathLamp), new PropertyMetadata(true));
public CornerRadius CornerRadius
{
get { return (CornerRadius)GetValue(CornerRadiusProperty); }
set { SetValue(CornerRadiusProperty, value); }
}
public LampEffect LampEffect
{
get { return (LampEffect)GetValue(LampEffectProperty); }
set { SetValue(LampEffectProperty, value); }
}
private static void OnLampEffectPropertyChangedCallBack(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
}
public bool IsLampStart
{
get { return (bool)GetValue(IsLampStartProperty); }
set { SetValue(IsLampStartProperty, value); }
}
}
}
二、BreathLamp.xaml 代码如下
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="clr-namespace:WPFDevelopers.Controls">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Basic/ControlBasic.xaml"/>
<ResourceDictionary Source="Basic/Animations.xaml"/>
</ResourceDictionary.MergedDictionaries>
<ControlTemplate x:Key="LampEffect_Eclipse" TargetType="{x:Type controls:BreathLamp}">
<Grid>
<Viewbox>
<Grid Width="60" Height="60">
<Border x:Name="PART_LampEclipse"
BorderThickness="0"
BorderBrush="Transparent"
CornerRadius="{TemplateBinding CornerRadius}"
Background="{DynamicResource DangerSolidColorBrush}"
RenderTransformOrigin="0.5,0.5">
<!--<Border.Effect>
<DropShadowEffect BlurRadius="25" ShadowDepth="0" Color="{DynamicResource DangerColor}"/>
</Border.Effect>-->
<Border.RenderTransform>
<ScaleTransform CenterX="0" CenterY="0" ScaleX="0.8" ScaleY="0.8"></ScaleTransform>
</Border.RenderTransform>
</Border>
<Border CornerRadius="{TemplateBinding CornerRadius}" BorderThickness="{TemplateBinding BorderThickness}" BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}"/>
</Grid>
</Viewbox>
<ContentPresenter/>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsLampStart" Value="True">
<Setter Property="Effect" TargetName="PART_LampEclipse">
<Setter.Value>
<DropShadowEffect BlurRadius="25" ShadowDepth="0" Color="{DynamicResource DangerColor}"/>
</Setter.Value>
</Setter>
<Trigger.EnterActions>
<BeginStoryboard>
<Storyboard RepeatBehavior="Forever" AutoReverse="True">
<DoubleAnimation Duration="0:0:1" BeginTime="0" From="0.8" To="1.1" Storyboard.TargetName="PART_LampEclipse" Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleX)" EasingFunction="{StaticResource SineEaseOut}"/>
<DoubleAnimation Duration="0:0:1" BeginTime="0" From="0.8" To="1.1" Storyboard.TargetName="PART_LampEclipse" Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleY)" EasingFunction="{StaticResource SineEaseOut}"/>
</Storyboard>
</BeginStoryboard>
</Trigger.EnterActions>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
<ControlTemplate x:Key="LampEffect_Ripple" TargetType="{x:Type controls:BreathLamp}">
<Grid>
<Viewbox>
<Grid Width="60" Height="60">
<Border x:Name="PART_LampRipple_1"
RenderTransformOrigin="0.5,0.5"
Background="Transparent"
BorderThickness="1"
CornerRadius="{TemplateBinding CornerRadius}"
BorderBrush="{DynamicResource DangerSolidColorBrush}">
<Border.RenderTransform>
<ScaleTransform CenterX="0" CenterY="0" ScaleX="0.8" ScaleY="0.8"></ScaleTransform>
</Border.RenderTransform>
</Border>
<Border x:Name="PART_LampRipple_2"
RenderTransformOrigin="0.5,0.5"
Background="Transparent"
BorderThickness="1"
CornerRadius="{TemplateBinding CornerRadius}"
BorderBrush="{DynamicResource DangerSolidColorBrush}">
<Border.RenderTransform>
<ScaleTransform ScaleX="0.8" ScaleY="0.8"></ScaleTransform>
</Border.RenderTransform>
</Border>
<Border CornerRadius="{TemplateBinding CornerRadius}" BorderThickness="{TemplateBinding BorderThickness}" BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}"/>
</Grid>
</Viewbox>
<ContentPresenter/>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsLampStart" Value="True">
<Trigger.EnterActions>
<BeginStoryboard>
<Storyboard RepeatBehavior="Forever" AutoReverse="True">
<DoubleAnimation Duration="0:0:1" BeginTime="0" From="0.8" To="1.3" Storyboard.TargetName="PART_LampRipple_1" Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleX)" EasingFunction="{StaticResource SineEaseOut}"/>
<DoubleAnimation Duration="0:0:1" BeginTime="0" From="0.8" To="1.3" Storyboard.TargetName="PART_LampRipple_1" Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleY)" EasingFunction="{StaticResource SineEaseOut}"/>
<DoubleAnimation Duration="0:0:1" BeginTime="0:0:0.4" From="0.8" To="1.3" Storyboard.TargetName="PART_LampRipple_2" Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleX)" EasingFunction="{StaticResource SineEaseOut}"/>
<DoubleAnimation Duration="0:0:1" BeginTime="0:0:0.4" From="0.8" To="1.3" Storyboard.TargetName="PART_LampRipple_2" Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleY)" EasingFunction="{StaticResource SineEaseOut}"/>
</Storyboard>
</BeginStoryboard>
</Trigger.EnterActions>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
<ControlTemplate x:Key="LampEffect_OuterGlow" TargetType="{x:Type controls:BreathLamp}">
<Grid>
<Viewbox>
<Grid Width="60" Height="60">
<Border x:Name="PART_LampOuterGlow"
Margin="1"
BorderThickness="0"
BorderBrush="Transparent"
CornerRadius="{TemplateBinding CornerRadius}"
Background="{DynamicResource DangerSolidColorBrush}"
RenderTransformOrigin="0.5,0.5">
<Border.Effect>
<DropShadowEffect x:Name="PART_LampOuterGlow_Effect" BlurRadius="0" ShadowDepth="0" Color="{DynamicResource DangerColor}"/>
</Border.Effect>
</Border>
<Border CornerRadius="{TemplateBinding CornerRadius}" BorderThickness="{TemplateBinding BorderThickness}" BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}"/>
</Grid>
</Viewbox>
<ContentPresenter/>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsLampStart" Value="True">
<Trigger.EnterActions>
<BeginStoryboard>
<Storyboard RepeatBehavior="Forever" >
<DoubleAnimation Duration="0:0:0.6" AutoReverse="True" BeginTime="0" From="0" To="40" Storyboard.TargetName="PART_LampOuterGlow_Effect" Storyboard.TargetProperty="BlurRadius" EasingFunction="{StaticResource SineEaseInOut}"/>
</Storyboard>
</BeginStoryboard>
</Trigger.EnterActions>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
<ControlTemplate x:Key="LampEffect_Streamer" TargetType="{x:Type controls:BreathLamp}">
<Grid>
<Viewbox>
<Grid Width="60" Height="60">
<Border x:Name="PART_LampContainer" CornerRadius="{TemplateBinding CornerRadius}" BorderThickness="{TemplateBinding BorderThickness}" Background="Transparent" >
<Border.BorderBrush>
<LinearGradientBrush >
<LinearGradientBrush.GradientStops>
<GradientStop Color="#FF00cec9" Offset="0"/>
<GradientStop Color="#2000cec9" Offset="0.3"/>
<GradientStop Color="Transparent" Offset="1" />
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</Border.BorderBrush>
</Border>
</Grid>
</Viewbox>
<Border Padding="{TemplateBinding BorderThickness}">
<ContentPresenter Margin="{TemplateBinding BorderThickness}"/>
</Border>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsLampStart" Value="True">
<Trigger.EnterActions>
<BeginStoryboard x:Name="PART_LampStoryboard">
<Storyboard RepeatBehavior="Forever">
<PointAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderBrush).(LinearGradientBrush.StartPoint)" Storyboard.TargetName="PART_LampContainer">
<EasingPointKeyFrame KeyTime="0:0:0.0" Value="0,1"/>
<EasingPointKeyFrame KeyTime="0:0:0.5" Value="0.855,0.148"/>
<EasingPointKeyFrame KeyTime="0:0:1" Value="0.852,0.855"/>
<EasingPointKeyFrame KeyTime="0:0:1.5" Value="0.148,0.855"/>
<EasingPointKeyFrame KeyTime="0:0:2" Value="0.144,0.149"/>
<EasingPointKeyFrame KeyTime="0:0:2.5" Value="0,0"/>
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderBrush).(LinearGradientBrush.EndPoint)" Storyboard.TargetName="PART_LampContainer">
<EasingPointKeyFrame KeyTime="0:0:0.0" Value="0,1"/>
<EasingPointKeyFrame KeyTime="0:0:0.5" Value="0.145,0.852"/>
<EasingPointKeyFrame KeyTime="0:0:1" Value="0.148,0.145"/>
<EasingPointKeyFrame KeyTime="0:0:1.5" Value="0.852,0.145"/>
<EasingPointKeyFrame KeyTime="0:0:2" Value="0.856,0.851"/>
<EasingPointKeyFrame KeyTime="0:0:2.5" Value="0,1"/>
</PointAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</Trigger.EnterActions>
<Trigger.ExitActions>
<StopStoryboard BeginStoryboardName="PART_LampStoryboard"/>
</Trigger.ExitActions>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
<Style TargetType="{x:Type controls:BreathLamp}" BasedOn="{StaticResource ControlBasicStyle}">
<Setter Property="BorderThickness" Value="1"/>
<Style.Triggers>
<Trigger Property="LampEffect" Value="Eclipse">
<Setter Property="Template" Value="{StaticResource LampEffect_Eclipse}"/>
</Trigger>
<Trigger Property="LampEffect" Value="Ripple">
<Setter Property="Template" Value="{StaticResource LampEffect_Ripple}"/>
</Trigger>
<Trigger Property="LampEffect" Value="OuterGlow">
<Setter Property="Template" Value="{StaticResource LampEffect_OuterGlow}"/>
</Trigger>
<Trigger Property="LampEffect" Value="Streamer">
<Setter Property="Template" Value="{StaticResource LampEffect_Streamer}"/>
</Trigger>
</Style.Triggers>
</Style>
</ResourceDictionary>
二、BreatheLightExample.xaml 代码如下
<UserControl x:Class="WPFDevelopers.Samples.ExampleViews.BreatheLightExample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WPFDevelopers.Samples.ExampleViews"
xmlns:wpfdev="https://github.com/yanjinhuagood/WPFDevelopers"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<UniformGrid Columns="2">
<Border Effect="{StaticResource NormalShadowDepth}" Width="400" Height="140" Background="{StaticResource WhiteSolidColorBrush}"
CornerRadius="3">
<Grid Margin="20,20,0,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<wpfdev:BreathLamp Width="60" Height="60" LampEffect="OuterGlow" Background="Transparent" IsLampStart="true"
VerticalAlignment="Top" HorizontalAlignment="Left">
<Ellipse>
<Ellipse.Fill>
<ImageBrush ImageSource="pack://application:,,,/WPFDevelopers.Samples;component/Images/Breathe/2.jpg"/>
</Ellipse.Fill>
</Ellipse>
</wpfdev:BreathLamp>
<TextBlock Grid.Column="1"
Margin="10,20"
FontSize="{StaticResource MediumFontSize}">
<Run Foreground="{StaticResource PrimaryTextSolidColorBrush}">
周星星|达叔
</Run>
<Run Foreground="{StaticResource SuccessPressedSolidColorBrush}">正在直播</Run>
</TextBlock>
<Button Style="{StaticResource PrimaryButton}" Grid.Column="1"
HorizontalAlignment="Right"
VerticalAlignment="Bottom" Content="进入直播"/>
</Grid>
</Border>
<Border Effect="{StaticResource NormalShadowDepth}" Width="400" Height="140" Background="{StaticResource WhiteSolidColorBrush}"
CornerRadius="3">
<Grid Margin="20,20,0,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<wpfdev:BreathLamp Width="60" Height="60" LampEffect="Eclipse" Background="LightGray" IsLampStart="true"
VerticalAlignment="Top" HorizontalAlignment="Left">
<Ellipse>
<Ellipse.Fill>
<ImageBrush ImageSource="pack://application:,,,/WPFDevelopers.Samples;component/Images/Breathe/1.jpg"/>
</Ellipse.Fill>
</Ellipse>
</wpfdev:BreathLamp>
<TextBlock Grid.Column="1"
Margin="10,20"
FontSize="{StaticResource MediumFontSize}"
TextWrapping="Wrap">
<Run Foreground="{StaticResource PrimaryTextSolidColorBrush}">
大话西游之大圣娶亲

</Run>
<Run Foreground="{StaticResource SuccessPressedSolidColorBrush}">正在直播</Run>
</TextBlock>
<Button Style="{StaticResource PrimaryButton}" Grid.Column="1"
HorizontalAlignment="Right"
VerticalAlignment="Bottom" Content="进入直播" Width="100"/>
</Grid>
</Border>
<Border Effect="{StaticResource NormalShadowDepth}" Width="400" Height="140" Background="{StaticResource WhiteSolidColorBrush}"
CornerRadius="3">
<Grid Margin="20,20,0,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<wpfdev:BreathLamp Width="60" Height="60" LampEffect="Ripple" Background="LightGray" IsLampStart="true"
VerticalAlignment="Top" HorizontalAlignment="Left">
<Ellipse>
<Ellipse.Fill>
<ImageBrush ImageSource="pack://application:,,,/WPFDevelopers.Samples;component/Images/Breathe/0.jpg"/>
</Ellipse.Fill>
</Ellipse>
</wpfdev:BreathLamp>
<TextBlock Grid.Column="1"
Margin="10,20"
FontSize="{StaticResource MediumFontSize}">
<Run Foreground="{StaticResource PrimaryTextSolidColorBrush}">
XXXYYY
</Run>
<Run Foreground="{StaticResource SuccessPressedSolidColorBrush}">正在直播</Run>
</TextBlock>
<Button Style="{StaticResource PrimaryButton}" Grid.Column="1"
HorizontalAlignment="Right"
VerticalAlignment="Bottom" Content="进入直播" Width="100"/>
</Grid>
</Border>
<Border Effect="{StaticResource NormalShadowDepth}" Width="400" Height="140" Background="{StaticResource WhiteSolidColorBrush}"
CornerRadius="3">
<Grid Margin="20,20,0,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<wpfdev:BreathLamp Width="60" Height="60" LampEffect="Streamer" Background="LightGray" IsLampStart="True"
VerticalAlignment="Top" HorizontalAlignment="Left">
<Ellipse Width="53" Height="53">
<Ellipse.Fill>
<ImageBrush ImageSource="pack://application:,,,/WPFDevelopers.Samples;component/Images/Chat/UserImages/yanjinhua.png"/>
</Ellipse.Fill>
</Ellipse>
</wpfdev:BreathLamp>
<TextBlock Grid.Column="1"
Margin="10,20"
FontSize="{StaticResource MediumFontSize}">
<Run Foreground="{StaticResource PrimaryTextSolidColorBrush}">
WPF开发者
</Run>
<Run Foreground="{StaticResource SuccessPressedSolidColorBrush}">正在直播</Run>
</TextBlock>
<Button Style="{StaticResource PrimaryButton}" Grid.Column="1"
HorizontalAlignment="Right"
VerticalAlignment="Bottom" Content="进入直播" />
</Grid>
</Border>
</UniformGrid>
</UserControl>
02
—
效果预览
鸣谢素材提供者 - 吴锋
源码地址如下
github:https://github.com/yanjinhuagood/WPFDevelopers.git
gitee:https://gitee.com/yanjinhua/WPFDevelopers.git
WPF开发者QQ群: 340500857
blogs: https://www.cnblogs.com/yanjinhua
Github:https://github.com/yanjinhuagood
出处:https://www.cnblogs.com/yanjinhua
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
转载请著名作者 出处 https://github.com/yanjinhuagood
扫一扫关注我们,
更多知识早知道!
点击阅读原文可跳转至源代码