WPF自定义动画控件 风机
一:创建WPF项目
二:在项目下添加文件Themes,在此文件下添加新项 ”资源词典“取名为 Generic.xaml 注意大小写,之前遇到因为大小写不对应,导致出错的情况
Generic.xaml文件代码如下:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:YinFengJi">
<Style TargetType="{x:Type local:YinFengJ}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:YinFengJ}">
<Viewbox>
<Canvas Height="100" Width="80" Background="Transparent">
<!--给水泵 右侧 通道-->
<Rectangle Canvas.Left="35" Canvas.Top="14.1" Width="28.3" Height="14.5">
<Rectangle.Fill>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<GradientStop Offset="0" Color="#646768"></GradientStop>
<GradientStop Offset="0.2" Color="#EFEEF3"></GradientStop>
<GradientStop Offset="0.5" Color="#EFEEF3"></GradientStop>
<GradientStop Offset="1" Color="#646768"></GradientStop>
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
<!--给水泵 右侧 关节-->
<Path Stroke="#7E7E7E" StrokeThickness="1" Data="M71.4,27.7c0,1.6-2,2.9-4.5,2.9l0,0c-2.5,0-4.5-1.3-4.5-2.9v-12.7c0-1.6,2-2.9,4.5-2.9l0,0
c2.5,0,4.5,1.3,4.5,2.9V27.7z">
<Path.Fill>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<GradientStop Offset="0" Color="#646768"></GradientStop>
<GradientStop Offset="0.2" Color="#EFEEF3"></GradientStop>
<GradientStop Offset="0.5" Color="#EFEEF3"></GradientStop>
<GradientStop Offset="1" Color="#646768"></GradientStop>
</LinearGradientBrush>
</Path.Fill>
</Path>
<!--给水泵 外边框-->
<Ellipse Canvas.Left="9.7" Canvas.Top="14" Width="50.2" Height="50.2">
<Ellipse.Fill>
<LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
<GradientStop Offset="0" Color="#BEBFC1"></GradientStop>
<GradientStop Offset="0.52" Color="#BEBFC1"></GradientStop>
<GradientStop Offset="0.54" Color="#7A7D7C"></GradientStop>
<GradientStop Offset="1" Color="#7A7D7C"></GradientStop>
</LinearGradientBrush>
</Ellipse.Fill>
</Ellipse>
<!--给水泵 风扇 背景-->
<Ellipse Fill="#626968" Canvas.Left="15.1" Canvas.Top="19.4" Width="39.4" Height="39.4"/>
<!--给水泵 三个 扇页-->
<Grid x:Name="GridFanJiShuiBeng" Canvas.Left="15.3" Canvas.Top="18.6" Width="39.4" Height="39.4" RenderTransformOrigin="0.5,0.5">
<Canvas Width="39.4" Height="39.4">
<Path Fill="#010C00" Data="M21.5,35.4c-0.3-0.1-0.6-0.3-0.9-0.5c-4.3-2.6-5.7-8.2-3.1-12.5c0.6-1,1.4-1.9,2.3-2.6
c-4.1-1.9-9.1-0.4-11.5,3.5c-2.6,4.3-1.2,9.9,3.1,12.5C14.7,37.9,18.7,37.6,21.5,35.4z"/>
<Path Fill="#010C00" Data="M5.3,13.5c0.3-0.2,0.5-0.4,0.8-0.6c4.3-2.6,9.9-1.3,12.5,3c0.6,1,1,2.1,1.2,3.3c3.6-2.8,4.6-7.9,2.1-11.9
c-2.6-4.3-8.2-5.6-12.5-3C6.5,7.1,4.7,10,5.3,13.5z"/>
<Path Fill="#010C00" Data="M32.4,10.4c0,0.3,0.1,0.7,0.1,1c0,5-4.1,9.1-9.1,9.1c-1.2,0-2.4-0.2-3.4-0.7c0.5,4.5,4.3,8,9,8
c5,0,9.1-4.1,9.1-9.1C38,15,35.7,11.7,32.4,10.4z"/>
</Canvas>
</Grid>
<!-- 风扇 圆心-->
<Ellipse Fill="#FCFCFC" Canvas.Left="32" Canvas.Top="35.3" Height="6" Width="6"/>
<Path Fill="#5C6162" Data="M27.2,69.3c0,1-0.6,1.8-1.2,1.8h-7.5c-0.7,0-1.2-0.8-1.2-1.8v-1.8c0-1,0.6-1.8,1.2-1.8h7.5
c0.7,0,1.2,0.8,1.2,1.8V69.3z"/>
<Path Fill="#5C6162" Data="M27.6,60.5c1.3,0.3,2.2,1.1,2,1.8l-2.1,7.8c-0.2,0.7-1.4,1.1-2.7,0.8l-2.4-0.5c-1.3-0.3-2.2-1.1-2-1.8
l2.1-7.8c0.2-0.7,1.4-1.1,2.7-0.8L27.6,60.5z"/>
<Path Fill="#5C6162" Data="M43.7,59.9c1.3-0.3,2.5,0.1,2.7,0.8l2,7.9c0.2,0.7-0.7,1.5-2,1.8l-2.4,0.5c-1.3,0.3-2.5-0.1-2.7-0.8l-2-7.9
c-0.2-0.7,0.7-1.5,2-1.8L43.7,59.9z"/>
<Path Fill="#5C6162" Data="M51.2,69.3c0,1-0.6,1.8-1.2,1.8h-7.5c-0.7,0-1.2-0.8-1.2-1.8v-1.8c0-1,0.6-1.8,1.2-1.8h7.5
c0.7,0,1.2,0.8,1.2,1.8V69.3z"/>
<!--标题-->
<TextBlock x:Name="JiShuiBengTitle" Text="给水泵" FontSize="20" FontWeight="Bold" Canvas.Left="7.1" Canvas.Top="74.4"></TextBlock>
<!--风力值-->
<TextBlock x:Name="FanValue" Visibility="Hidden"></TextBlock>
</Canvas>
</Viewbox>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
三:在项目下添加实现类
代码如下:
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Media;
using System.Windows.Media.Animation;
namespace YinFengJi
{
/// <summary>
///
/// </summary>
public class YinFengJ : Button
{
/// <summary>
/// 转速设置
/// </summary>
private int RotationRate = 0;
/// <summary>
/// 动画 重复 次数
/// </summary>
private int RotationRepeatTime = 100000;
static YinFengJ()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(YinFengJ), new FrameworkPropertyMetadata(typeof(YinFengJ)));
}
#region 控件列表
/// <summary>
/// 风扇 扇页元素
/// </summary>
Grid _GridFanJiShuiBeng = null;
/// <summary>
/// 风力大小
/// </summary>
TextBlock _FanValue = null;
/// <summary>
/// 动画标题
/// </summary>
TextBlock _JiShuiBengTitle = null;
#endregion
#region 控件绑定
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
_GridFanJiShuiBeng = GetTemplateChild("GridFanJiShuiBeng") as Grid;
_FanValue = GetTemplateChild("FanValue") as TextBlock;
_JiShuiBengTitle = GetTemplateChild("JiShuiBengTitle") as TextBlock;
_FanValue.SetBinding(TextBlock.TextProperty, new Binding("FanValue") { Source = this });
_JiShuiBengTitle.SetBinding(TextBlock.TextProperty, new Binding("JiShuiBengTitle") { Source = this });
_GridFanJiShuiBeng.SetBinding(Grid.StyleProperty, new Binding("FanValue") { Source = this });
}
#endregion
#region 依赖及属性
/// <summary>
/// 标题
/// </summary>
public string JiShuiBengTitle
{
get { return (string)GetValue(_JiShuiBengTitleProperty); }
set { SetValue(_JiShuiBengTitleProperty, value); }
}
public static readonly DependencyProperty _JiShuiBengTitleProperty =
DependencyProperty.Register("JiShuiBengTitle", typeof(string), typeof(YinFengJ), new PropertyMetadata("引风机"));
/// <summary>
/// 风力值
/// </summary>
public float FanValue
{
get { return (float)GetValue(_FanValueProperty); }
set { SetValue(_FanValueProperty, value); }
}
public static readonly DependencyProperty _FanValueProperty =
DependencyProperty.Register("FireValue", typeof(float), typeof(YinFengJ), new PropertyMetadata(0f, FanValueCallBack));
private static void FanValueCallBack(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
(d as YinFengJ).FanValueStoryboardPlay(e);
}
private void FanValueStoryboardPlay(DependencyPropertyChangedEventArgs e)
{
float newV = float.Parse(e.NewValue.ToString());
float oldV = float.Parse(e.OldValue.ToString());
////转速设置
RotationRepeatTime = 100000;
if (newV == 1)
{
RotationRate = 35000;
}
else if (newV == 2)
{
RotationRate = 16000;
}
else if (newV == 3)
{
RotationRate = 6000;
}
else if (newV == 0)
{
RotationRepeatTime = 0;
}
//元素 转动动画
RotateTransform rtGSB = new RotateTransform();
rtGSB.CenterX = 0;
rtGSB.CenterY = 0;
_GridFanJiShuiBeng.RenderTransform = rtGSB;
//rotationRate = 9000;
DoubleAnimation GSB_DA = new DoubleAnimation(0, 3000, new Duration(TimeSpan.FromMilliseconds(RotationRate)));
GSB_DA.RepeatBehavior = new RepeatBehavior(RotationRepeatTime);
rtGSB.BeginAnimation(RotateTransform.AngleProperty, GSB_DA);
}
#endregion
}
}
四:以类库项目输出,就可以作为控件用于其它WPF项目了
此程序中的Generic.xaml 是由,svg格式图中的元素修改来的,注意svg图片元素跟xaml格式的区别
WPF自定义动画控件 风机的更多相关文章
- WPF自定义分页控件,样式自定义,简单易用
WPF自定义分页控件 做了许久伸手党,终于有机会贡献一波,搜索一下WPF分页控件,还是多,但是不太通用,主要就是样式问题,这个WPF很好解决,还有一个就是分页控件嘛,只关心几个数字的变动就行了,把页码 ...
- 浅尝辄止WPF自定义用户控件(实现颜色调制器)
主要利用用户控件实现一个自定义的颜色调制控件,实现一个小小的功能,具体实现界面如下. 首先自己新建一个wpf的用户控件类,我就放在我的wpf项目的一个文件夹下面,因为是一个很小的东西,所以就没有用mv ...
- WPF 自定义Button控件及样式
这次通过最近做的小例子说明一下自定义Button控件和样式. 实现的效果为:
- 继续聊WPF——自定义CheckBox控件外观
上一篇文章中谈到了BulletDecorator控件,就是为自定义CheckBox控件的模板做准备,因为CheckBox需要比较严格的布局,正好,BulletDecorator控件就合适了,该控件的布 ...
- wpf 自定义RadioButton控件样式
实现的效果为: 我感觉来自定义RadioButton样式和定义button空间的样式差不多,只是类型不同而已. 接下来分析一下样式代码: <!--自定义单选按钮样式--> & ...
- WPF 自定义TabControl控件样式
一.前言 程序中经常会用到TabControl控件,默认的控件样式很普通.而且样式或功能不一定符合我们的要求.比如:我们需要TabControl的标题能够居中.或平均分布:或者我们希望TabContr ...
- WPF自定义用户控件不显示
1,Themes\Generic.xaml最好不要更名 "Generic.xaml"这个名称并非偶然通过上面的叙述,你可能会有冲动将Generic.xaml中的Style代码剪切出 ...
- WPF 自定义分页控件二
一:添加自定义分页控件,命名为KDataPagerTwo: public class KDataPagerTwo : Control, INotifyPropertyChanged { static ...
- WPF 自定义分页控件一
一:右键添加新建项,选择新建自定义控件,命名为:KDataPager public class KDataPager : Control { static KDataPager() { Default ...
随机推荐
- CentOS6.9下NFS配置说明
NFS是Network File System的缩写,即网络文件系统.它的主要功能是通过网络(一般是局域网)让不同的主机系统之间可以共享文件或目录.NFS客户端可以通过挂载(mount)的方式将NFS ...
- 理解Linux CPU负载和 CPU使用率
CPU负载和 CPU使用率 这两个从一定程度上都可以反映一台机器的繁忙程度. cpu使用率反映的是当前cpu的繁忙程度,忽高忽低的原因在于占用cpu处理时间的进程可能处于io等待状态但却还未释放进入w ...
- POJ3617 Best Cow Line【贪心】
Description 给定长度为n的字符串S,要构造一个长度为n的字符串T.起初,T是空串,随后反复进行下列任意操作: 1.从S的头部删除一个字符,加到T的尾部 2.从S的尾部删除一个字符,加 ...
- Linux思维导图之sed、实战习题
命令解释: ◆sed 2p /etc/passwd第二行打印了两次其余一次 ◆sed-n '2p' /etc/passwd 只打印出第二行 ◆sed-n 1,4p' /etc/passwd 只打印出1 ...
- tornado服务器运行django应用
在jumpserver项目中看到的 def main(): from django.core.wsgi import get_wsgi_application import tornado.wsgi ...
- Bootstrap关于排版
1.Bootstrap和普通的HTML页面一样,定义标题都是使用标签<h1>到<h6>,只不过Bootstrap覆盖了其默认的样式 2.使用了<small>标签来制 ...
- 【ACM】hdu_zs2_1004_Problem D _201308030856
Problem D Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)Total Subm ...
- D - Mayor's posters
D - Mayor's posters POJ - 2528 思路:线段树+离散化. 离散化时注意特殊情况,如果两个数相差大于一,离散时也应该差1.比如 1 3 离散后应该为 1 2. 错因: 1.二 ...
- 1103 N的倍数
1103 N的倍数 题目来源: Ural 1302 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 一个长度为N的数组A,从A中选出若干个数,使得 ...
- C#编程中,在页面上如何弹出确认删除对话框
对于页面完成一个操作后,弹出一个对话框提示是否“操作成功”.举例如下:Response.Write("<script>alert('删除成功!')</script>& ...