WPF 制作便携小空调

今天看到群里一个小页面挺有意思的,就是这个:

https://ac.yunyoujun.cn/

于是想着用wpf也模仿一下嘿嘿,为了方便,也顾不上什么代码结构了。。。

看看效果吧:

代码不多,只有一个窗口,下面就直接看看代码:

窗体xaml:

<Window x:Class="AirCond.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:AirCond"ResizeMode="NoResize"WindowStyle="None"Topmost="True"AllowsTransparency="True"Background="Transparent"Width="300"SizeToContent="Height"mc:Ignorable="d"Title="MainWindow"><StackPanel><Border Height="120" MouseDown="Border_MouseDown" VerticalAlignment="Top" Background="#F8F8F8" Margin="10" CornerRadius="15 15 30 30"><Border.Effect><DropShadowEffect ShadowDepth="0" BlurRadius="10" Color="#66ffffff"/></Border.Effect><Grid><local:IconFontButton x:Name="shutDownButton" Click="ShutDownClick" Geometry="{StaticResource ShutDownIcon}" HorizontalAlignment="Right" VerticalAlignment="Top" IconWidth="16" IconHeight="16" Margin="3" Foreground="Red"/><Image Width="40" Height="70" Source="/info.png" Margin="10" HorizontalAlignment="Left" VerticalAlignment="Top"/><Image x:Name="snow" Width="26" Height="32" Source="/snow.png" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="0 15 66 0"/><TextBlock x:Name="tempText" Text="{Binding Temp,StringFormat={}{0}°C}" HorizontalAlignment="Right" Margin="0 40 30 0" FontSize="33" FontWeight="Bold" FontFamily="{StaticResource Digital}" Foreground="Red"/><Border Height="1" Background="Gray" Margin="0 56 0 0" /><TextBlock Text="Powered by WPF"  Foreground="{StaticResource LinearBrush}" FontFamily="微软雅黑" FontSize="10" VerticalAlignment="Bottom" HorizontalAlignment="Center" Margin="0 0 0 35"/><TextBlock Text="新能源空调,靠爱发电" Foreground="{StaticResource LinearBrush}" Opacity="0.5" Padding="6" FontSize="14" TextAlignment="Center" FontFamily="微软雅黑" HorizontalAlignment="Stretch" VerticalAlignment="Bottom"></TextBlock></Grid></Border><Grid x:Name="windGrid" Height="60" Width="200" Visibility="Visible"><Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinition/><ColumnDefinition/></Grid.ColumnDefinitions><Border Grid.Column="0" Width="6" Height="50" RenderTransformOrigin="0.5,0.5" Background="#0BE8EB"><Border.RenderTransform><RotateTransform Angle="15"/></Border.RenderTransform></Border><Border Grid.Column="1" Width="6" Height="50" Background="#0BE8EB"/><Border Grid.Column="2" Width="6" Height="50" RenderTransformOrigin="0.5,0.5" Background="#0BE8EB"><Border.RenderTransform><RotateTransform Angle="-15"/></Border.RenderTransform></Border></Grid></StackPanel>
</Window>

窗体后台代码:

using System;
using System.ComponentModel;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;namespace AirCond
{public partial class MainWindow : Window,INotifyPropertyChanged{public MainWindow(){InitializeComponent();DataContext = this;MouseWheel += MainWindow_MouseWheel;}private void MainWindow_MouseWheel(object sender, MouseWheelEventArgs e){Temp += (e.Delta > 0 ? 1 : -1);}private int _temp=16;public int Temp{get { return _temp; }set { _temp = value;_temp = Math.Min(31, _temp);_temp = Math.Max(16, _temp);OnPropertyChanged(nameof(Temp)); }}private bool _isOpen=true;public bool IsOpen{get { return _isOpen; }set { _isOpen = value;OnPropertyChanged(nameof(IsOpen));SetUI();}}private void SetUI(){shutDownButton.Foreground = _isOpen ? Brushes.Red : Brushes.Gray;if (_isOpen){StartAnimationIn(snow);StartAnimationIn(windGrid);StartAnimationIn(tempText);}else{StartAnimationOut(snow);StartAnimationOut(windGrid);StartAnimationOut(tempText);}}private async void StartAnimationIn(FrameworkElement element, float seconds=0.5f){var sb = new Storyboard();var fadeIn = new DoubleAnimation{Duration = new Duration(TimeSpan.FromSeconds(seconds)),To = 1,};Storyboard.SetTargetProperty(fadeIn, new PropertyPath("Opacity"));sb.Children.Add(fadeIn);sb.Begin(element);await Task.Delay((int)(seconds * 1000));}private async void StartAnimationOut(FrameworkElement element, float seconds = 0.5f){var sb = new Storyboard();var fadeIn = new DoubleAnimation{Duration = new Duration(TimeSpan.FromSeconds(seconds)),To = 0,};Storyboard.SetTargetProperty(fadeIn, new PropertyPath("Opacity"));sb.Children.Add(fadeIn);sb.Begin(element);await Task.Delay((int)(seconds * 1000));}public event PropertyChangedEventHandler PropertyChanged;public void OnPropertyChanged(string name){PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));}private void Border_MouseDown(object sender, MouseButtonEventArgs e){if(e.LeftButton==MouseButtonState.Pressed)this.DragMove();}private void ShutDownClick(object sender, RoutedEventArgs e){IsOpen = !IsOpen;}}
}

在App.xaml里面定义资源:

<Application x:Class="AirCond.App"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="clr-namespace:AirCond"StartupUri="MainWindow.xaml"><Application.Resources><FontFamily x:Key="Digital">pack://application;,,,/Fonts/#Digital-7 Mono</FontFamily><PathGeometry x:Key="ShutDownIcon" Figures="M209.664 813.696a426.666667 426.666667 0 0 1 0-603.392 42.666667 42.666667 0 0 1 60.330667 60.330667 341.333333 341.333333 0 1 0 482.474666 0 42.666667 42.666667 0 0 1 60.330667-60.330667A426.666667 426.666667 0 0 1 209.664 813.696zM511.36 85.333333a42.666667 42.666667 0 0 1 42.666667 42.666667v384a42.666667 42.666667 0 0 1-85.333334 0V128a42.666667 42.666667 0 0 1 42.666667-42.666667z"/><LinearGradientBrush x:Key="LinearBrush"><GradientStop Offset="0" Color="Red"/><GradientStop Offset="0.5" Color="Blue"/><GradientStop Offset="1" Color="Green"/></LinearGradientBrush><Style TargetType="local:IconFontButton"><Setter Property="CornerRadius" Value="0"/><Setter Property="Padding" Value="5"/><Setter Property="Background" Value="Transparent"/><Setter Property="Foreground" Value="Gray"/><Setter Property="BorderBrush" Value="Transparent"/><Setter Property="FocusVisualStyle" Value="{x:Null}"/><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="local:IconFontButton"><Border CornerRadius="{TemplateBinding CornerRadius}" Background="{TemplateBinding Background}" BorderThickness="0"><Path x:Name="path" Data="{TemplateBinding Geometry}" Fill="{TemplateBinding Foreground}"Width="{TemplateBinding IconWidth}"Height="{TemplateBinding IconHeight}"SnapsToDevicePixels="True"Stretch="Uniform"RenderTransformOrigin="0.5,0.5"Margin="{TemplateBinding Padding}"><Path.RenderTransform><TransformGroup><ScaleTransform ScaleX="1" ScaleY="1" /></TransformGroup></Path.RenderTransform></Path></Border><ControlTemplate.Triggers><EventTrigger RoutedEvent="UIElement.MouseEnter"><BeginStoryboard ><Storyboard><DoubleAnimation Storyboard.TargetName="path" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)" To="1.2" Duration="0:0:0.1" AutoReverse="False" /><DoubleAnimation Storyboard.TargetName="path" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)" To="1.2" Duration="0:0:0.1" AutoReverse="False" /></Storyboard></BeginStoryboard></EventTrigger><EventTrigger RoutedEvent="UIElement.MouseLeave"><BeginStoryboard><Storyboard><DoubleAnimation Storyboard.TargetName="path" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)" To="1" Duration="0:0:0.1" AutoReverse="False" /><DoubleAnimation Storyboard.TargetName="path" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)" To="1" Duration="0:0:0.1" AutoReverse="False" /></Storyboard></BeginStoryboard></EventTrigger></ControlTemplate.Triggers></ControlTemplate></Setter.Value></Setter>
</Style></Application.Resources>
</Application>

创建一个IconFontButton类:

using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;namespace AirCond
{public class IconFontButton : Button{public Geometry Geometry{get { return (Geometry)GetValue(GeometryProperty); }set { SetValue(GeometryProperty, value); }}public static readonly DependencyProperty GeometryProperty =DependencyProperty.Register("Geometry", typeof(Geometry), typeof(IconFontButton), new PropertyMetadata(default(Geometry)));public CornerRadius CornerRadius{get { return (CornerRadius)GetValue(CornerRadiusProperty); }set { SetValue(CornerRadiusProperty, value); }}public static readonly DependencyProperty CornerRadiusProperty =DependencyProperty.Register("CornerRadius", typeof(CornerRadius), typeof(IconFontButton), new PropertyMetadata(default(CornerRadius)));public double IconWidth{get { return (double)GetValue(IconWidthProperty); }set { SetValue(IconWidthProperty, value); }}public static readonly DependencyProperty IconWidthProperty =DependencyProperty.Register("IconWidth", typeof(double), typeof(IconFontButton), new PropertyMetadata(32.0));public double IconHeight{get { return (double)GetValue(IconHeightProperty); }set { SetValue(IconHeightProperty, value); }}public static readonly DependencyProperty IconHeightProperty =DependencyProperty.Register("IconHeight", typeof(double), typeof(IconFontButton), new PropertyMetadata(32.0));}
}

图片和字体来源于网络,仅用于学习用途,如有侵权,请联系我删除。

如需图片和字体资源,请下载:

项目代码百度云链接:(给白嫖怪的惊喜)

链接:https://pan.baidu.com/s/1R1lxv-rcQI3rytn3epJP6Q

提取码:s5hl

效果图:

如果喜欢,点个赞呗~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/302520.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ML.NET 示例:将ML.NET模型导出到ONNX

在这个示例中&#xff0c;您将看到如何使用ML.NET来训练回归模型&#xff0c;然后将该模型转换为ONNX格式。问题开放式神经网络交换即ONNX是一种表示深度学习模型的开放格式。使用ONNX&#xff0c;开发人员可以在最先进的工具之间移动模型&#xff0c;并选择最适合他们的组合。…

别写代码了!行吗?

全世界有3.14 % 的人已经关注了数据与算法之美01刚才等红绿灯的时候&#xff0c;天开始下雨了。这时候旁边的程序员首先开口说&#xff1a;“下雨了。”大概过了5秒钟&#xff0c;其他人&#xff1a;对哦&#xff0c;有点下雨了。其实&#xff0c;这说的是程序员头秃的故事。02…

dma接收双缓存 stm32_「STM32学习笔记」USART 新特性

之前的学习笔记“SPI不够用&#xff1f;USART来帮忙”一文中介绍了用如何把USART当做SPI来用的方法。此外&#xff0c;ST的USART还有很多新特性&#xff0c;没准有你不知道的。在此&#xff0c;我们整理出来以下串口新特性&#xff0c;供大家参考。支持RXD和TXD管脚互换很多时候…

为什么数学叫“数学”?

全世界有3.14 % 的人已经关注了数据与算法之美“数学”一词是来自希腊语&#xff0c;它意味着某种“已学会或被理解的东西”或“已获得的知识”&#xff0c;甚至意味着“可获的东西”&#xff1b;“可学会的东西”&#xff0c;即“通过学习可获得的知识”&#xff0c;数学名称的…

5月TIOBE编程榜,Java、PHP降级,C#再度上升!

TIOBE 5月编程语言榜单显示&#xff0c;Java数据下滑&#xff0c;排名降级了一位&#xff0c;被Python超越&#xff1b;PHP继续大幅下滑&#xff0c;排名降级到第9&#xff1b;而C#则是再度稳中求进&#xff0c;已经连续N个月上涨了。曾经Web开发三大语言&#xff0c;在2020年后…

捷达vs7测试_捷达VS7——品质硬核!

立冬&#xff0c;准备好“冬眠”了吗&#xff1f;一汽大众的子品牌-捷达(Jetta)在去年9月推出VS5和VA3之后&#xff0c;新型SUV&#xff0c;捷达VS7车型已在国内正式开始预售。这款新车基于大众MQB平台构建&#xff0c;将推出4款车型供消费者选择&#xff0c;定位为紧凑型SUV。…

一句 Task.Result 就死锁, 这代码还怎么写?

一&#xff1a;背景 1. 讲故事前些天把 .NET 高级调试 方面的文章索引到 https://github.com/ctripxchuang/dotnetfly 的过程中&#xff0c;发现了一个有意思的评论&#xff0c;截图如下&#xff1a;大概就是说在 Winform 的主线程下执行 Task.Result 会造成死锁&#xff0c;我…

ant 改变表格数据_表格技巧—Excel表格怎么替换数字

在编制报表时&#xff0c;如果把序列号中的某些数字改变&#xff0c;一个个更正&#xff0c;肯定是比重新录一遍还要慢的&#xff0c;如果只是想替换其中的数字&#xff0c;其实可以利用Excel表格自带的查找替换功能&#xff0c;一步到位解决。接下来小编教大家怎么样将一大批的…

程序员的鄙视链

全世界有3.14 % 的人已经关注了数据与算法之美最近这几年在世界各地突然吹起了一股全民写程序的风潮&#xff0c;连即将卸任的美国总统奥巴马都在写 JavaScript 了&#xff0c;但是身为一介靠写程序&#xff08;以及在上班时间胡乱上网&#xff09;来谋生的 developer&#xff…

基于 registry 搭建 Docker 私有镜像仓库

dockerhub: https://registry.hub.docker.com/_/registry安装命令docker run -p 5000:5000 -d -v /opt/registry:/opt/registry --restart always --name myregistry registry参数介绍&#xff1a;•-p 容器的端口映射&#xff0c;这里绑定 5000•-d 后台运行容器•-v 挂载主机…

BBSXP论坛手工得到用户md5密码的方法

07年发表在《***手册》的一篇文章。通过阅读本文&#xff0c;您将了解到&#xff1a;1、一种手工得到两个版本的BBSXP论坛的用户md5密码的方法。2、如何Cookie欺骗。大家都知道BBSXP论坛5.13&#xff0c;5.15版本的blog.asp文件存在注入漏洞&#xff0c;网上也有几种这个漏洞的…

2010C语言添加背景图片_2019级C语言大作业 - 火柴人试炼之地

C语言大作业 - 火柴人试炼之地https://www.zhihu.com/video/1200491618794606592分享19级同学大一上学期用C语言实现的火柴人试炼之地。分步骤代码、图片音乐素材、可执行程序可以从百度网盘下载&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1XelHD8GVnXfR8coAYOAC9w …

基于单TCP连接的高吞吐模型设计

对于服务与服务之间往往需要高效的吞吐的信息交互&#xff0c;但在绝大部分服务应用中为了实现高吞吐交互都是基于连接池模式&#xff0c;即通过多个TCP连接来提高吞吐量&#xff0c;这种设计完全是通过增加IO的读写量来实现高效吞吐。如果能减少连数和降低IO量&#xff08;合并…

程序员8大终极杀器,你get了几个?

全世界有3.14 % 的人已经关注了数据与算法之美经常有同学问&#xff1a;作为程序员&#xff0c;终极杀器是什么&#xff1f;其实有大佬早已回答过&#xff1a;持续学习&#xff0c;开阔视野才是程序员的终极杀器&#xff01;基于此&#xff0c;给大家一个建议&#xff1a;不妨多…

winserver2016 401您无权使用所提供的凭据查看此目录或页面_不用找了,30分钟帮你搞定使用 Spring Cloud 和 Docker 轻松构建微服务架构!...

点击上方[全栈开发者社区]→右上角[...]→[设为星标⭐]【编者的话】如何使用Spring Boot、Spring Cloud、Docker和Netflix的一些开源工具来构建一个微服务架构。本文通过使用Spring Boot、Spring Cloud和Docker构建的概念型应用示例&#xff0c;提供了了解常见的微服务架构模式…

女朋友掉水里,各类程序猿怎么救?

全世界有3.14 % 的人已经关注了数据与算法之美前天发了一篇有趣的文章《如果辅导员掉进水里&#xff0c;各个专业的学生将会如何解救&#xff1f;》那么&#xff0c;如果程序猿的女朋友落水了&#xff0c;他们会怎么救呢&#xff1f;不会像在校的计算机学院的学生那样“找跟网线…

联机分析的列式数据库 clickHouse

ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。在传统的行式数据库系统中&#xff0c;数据按如下顺序存储&#xff1a;RowWatchIDJavaEnableTitleGoodEventEventTime#0893543506621Investor Relations12016-05-18 05:19:20#1903295099580Contact us12016-05-…

网管小王的工具包

我是一名网管&#xff0c;工作主要是维护单位的网络线路和电话线路&#xff0c;今天闲来没事&#xff0c;把工具包中的工具show一下吧。笔记本电脑打线器&#xff0c;用来维修模块和打线用的两根长短不同的网线和一根电话线螺丝刀&#xff0c;什么扁口&#xff0c;十字花&#…

.NET之生成数据库全流程

开篇语本文主要是回顾下从项目创建到生成数据到数据库(代码优先)的全部过程。采用EFCore作为ORM框架。本次示例环境&#xff1a;vs2019、net5、mysql创建项目本次事例代码是用过vs2019创建的ASP.NET Core Web API项目可以通过可视化界面创建或者通过命令行创建dotnet new webap…

进军人工智能,数学基础很重要?

随着科技的快速发展&#xff0c;人工智能的重要性日渐显现。对于大多数新手来说&#xff0c;弄清楚入门人工智能需要哪些数学基础、需要熟悉什么框架等&#xff0c;都至关重要。机器学习是一个异常丰富的研究领域&#xff0c;有大量未解决的问题&#xff1a;公正、可解释性、易…