Avalonia学习(二十九)-仪表

Avalonia制作仪表盘,把控件给大家演示一下,Avalonia有三类自定义控件,分别是用户控件、模版控件、自主控件。前面已经很多用户控件了,这个是演示模版控件,另外一种不知道哪种情况下使用。

前端代码:

<Styles xmlns="https://github.com/avaloniaui"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="clr-namespace:GaugeAvalonia.Views;assembly=GaugeAvalonia"x:CompileBindings="False"><Design.PreviewWith><Border Padding="20"><!-- Add Controls for Previewer Here --></Border></Design.PreviewWith><Style  Selector="local|ArcGauge"><Setter Property="Background" Value="#646464"/><Setter Property="Foreground" Value="Black"/><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="{x:Type local:ArcGauge}"><Border Margin="10"><Grid Width="{Binding RelativeSource={RelativeSource Self},Path=Height}"><Ellipse Fill="#FF3B3B3B"/><Grid RenderTransformOrigin="0.5,0.5" Margin="2"><Grid.RenderTransform><TransformGroup><RotateTransform  Angle="{Binding Angle}"/></TransformGroup></Grid.RenderTransform><Ellipse Width="16" Height="14" Fill="Orange" VerticalAlignment="Top" ><Ellipse.Effect><BlurEffect Radius="12"/></Ellipse.Effect></Ellipse></Grid><Grid x:Name="bdGrid" Margin="12" UseLayoutRounding="True" ClipToBounds="True"><Ellipse><Ellipse.Fill><RadialGradientBrush><GradientStop Color="#4D000000"/></RadialGradientBrush></Ellipse.Fill></Ellipse><Grid><Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinition Width="2*"/><ColumnDefinition/></Grid.ColumnDefinitions><Grid.RowDefinitions><RowDefinition/><RowDefinition Height="2*"/><RowDefinition/></Grid.RowDefinitions><Ellipse Stroke="#464646" StrokeThickness="1" Grid.Column="1" Grid.Row="1"/><Ellipse Stroke="#959595" Margin="4" StrokeThickness="6" Grid.Column="1" Grid.Row="1"/><Ellipse Stroke="#464646" Margin="14" StrokeThickness="1" Grid.Column="1" Grid.Row="1"/></Grid><Grid><Grid.RowDefinitions><RowDefinition/><RowDefinition/></Grid.RowDefinitions><Path  Data="M5,0 5,0 10,120 0,120z" Fill="#0FA9CE" Stretch="Uniform" Margin="0 30 0 0"  HorizontalAlignment="Center"><Path.RenderTransform><TransformGroup><RotateTransform    Angle="{Binding Path=Angle, Mode=TwoWay}"/></TransformGroup></Path.RenderTransform></Path></Grid><Ellipse Width="28" Height="28" Fill="Black"><Ellipse.Effect><!--<DropShadowEffect Color="#0FA9CE" ShadowDepth="0" Direction="0" BlurRadius="16"/>--></Ellipse.Effect></Ellipse><Border VerticalAlignment="Bottom" BorderBrush="#10ABD1" BorderThickness="2" Margin="0 0 0 12" Background="Black" Padding="8 2" HorizontalAlignment="Center"><TextBlock Text="{Binding Value,RelativeSource={RelativeSource Mode=TemplatedParent}}" FontSize="16" Width="30" TextAlignment="Center" Foreground="White" FontWeight="Bold"/></Border></Grid></Grid></Border></ControlTemplate></Setter.Value></Setter></Style></Styles>

后台代码:

using Avalonia;
using Avalonia.Controls;
using Avalonia.Controls.Shapes;
using Avalonia.Media;
using System.Collections.Generic;
using System.ComponentModel;
using Avalonia.Controls.Templates;
using Avalonia.Controls.Primitives;
using System.Linq;namespace GaugeAvalonia.Views
{public class ArcGauge: TemplatedControl{Grid bdGrid;static ArcGauge(){// DefaultStyleKeyProperty.OverrideMetadata(typeof(ArcGauge), new FrameworkPropertyMetadata(typeof(ArcGauge)));}public ArcGauge(){this.Loaded += ArcGauge_Loaded;//Width = 200;//Height = 200;SetCurrentValue(ValueProperty, 0d);SetCurrentValue(MinValueProperty, 0d);SetCurrentValue(MaxValueProperty, 100d);}private void ArcGauge_Loaded(object? sender, Avalonia.Interactivity.RoutedEventArgs e){InitTick();}public override void Render(DrawingContext context){base.Render(context);bdGrid = (Grid)this.GetTemplateChildren().Where(x => x.Name == "bdGrid").First();Refresh();}private void InitTick(){// 画大刻度for (int i = 0; i < 9; i++){Line line = new Line();line.StartPoint = new Point(0, 0);line.EndPoint=new Point(0, 12);line.HorizontalAlignment= Avalonia.Layout.HorizontalAlignment.Center;line.Stroke = Brushes.White;line.StrokeThickness = 2;line.RenderTransformOrigin = RelativePoint.Center;line.RenderTransform = new RotateTransform() { Angle = -140 + i * 35 };bdGrid.Children.Add(line);DrawText();}            // 画小刻度for (int i = 0; i < 8; i++){var start = -140 + 35 * i + 3.5;for (int j = 0; j < 9; j++){Line line = new Line();line.StartPoint = new Point(0, 0);line.EndPoint = new Point(0, 6);line.Stroke = Brushes.White;line.StrokeThickness = 1;line.HorizontalAlignment = Avalonia.Layout.HorizontalAlignment .Center;line.RenderTransformOrigin = RelativePoint.Center;line.RenderTransform = new RotateTransform() { Angle = start + j * 3.5 };bdGrid.Children.Add(line);}}}List<TextBlock> textLabels = new List<TextBlock>();private void DrawText(){foreach (var item in textLabels){bdGrid.Children.Remove(item);}textLabels.Clear();var per = MaxValue / 8;for (int i = 0; i < 9; i++){TextBlock textBlock = new TextBlock();textBlock.Text = $"{MinValue + (per * i)}";textBlock.HorizontalAlignment =  Avalonia.Layout.HorizontalAlignment.Center;textBlock.RenderTransformOrigin = RelativePoint.Center;textBlock.RenderTransform = new RotateTransform() { Angle = -140 + i * 35 };textBlock.Margin = new Thickness(12);textBlock.Foreground = Brushes.White;bdGrid.Children.Add(textBlock);textLabels.Add(textBlock);}}//public static readonly StyledProperty<IBrush> BackgroundProperty =//   AvaloniaProperty.Register<ArcGauge, IBrush>(nameof(Value));//public IBrush Background//{//    get//    {//        return GetValue(BackgroundProperty);//    }//    set//    {//        SetValue(BackgroundProperty, value);//    }//}//public static readonly StyledProperty<IBrush> ForegroundProperty =// AvaloniaProperty.Register<ArcGauge, IBrush>(nameof(Value));//public IBrush Foreground//{//    get//    {//        return GetValue(ForegroundProperty);//    }//    set//    {//        SetValue(ForegroundProperty, value);//    }// }[Category("值设定")]public double Value{get { return (double)GetValue(ValueProperty); }set { SetValue(ValueProperty, value); }}public static readonly StyledProperty<double> ValueProperty =AvaloniaProperty.Register<ArcGauge, double>(nameof(Value), coerce: OnValueChanged);private static double OnValueChanged(AvaloniaObject @object, double arg2){ArcGauge gauge= @object  as ArcGauge;gauge.Refresh();return arg2;}[Category("值设定")]public double MinValue{get { return (double)GetValue(MinValueProperty); }set { SetValue(MinValueProperty, value); }}public static readonly StyledProperty<double> MinValueProperty =AvaloniaProperty.Register<ArcGauge, double>(nameof(MinValue), coerce: OnValueChanged);public double MaxValue{get { return (double)GetValue(MaxValueProperty); }set { SetValue(MaxValueProperty, value); }}public static readonly StyledProperty<double> MaxValueProperty =AvaloniaProperty.Register<ArcGauge, double>(nameof(MaxValue), coerce: OnValueChanged);public double Angle{get { return (double)GetValue(AngleProperty); }set { SetValue(AngleProperty, value); }}public static readonly StyledProperty<double> AngleProperty =AvaloniaProperty.Register<ArcGauge, double>(nameof(Angle));private void Refresh(){if (Value > MaxValue){Angle = 140;}else if (Value < MinValue){Angle = -140;}else{var range = MaxValue - MinValue;var process = Value / range;var tAngle = process * 280 - 140;Angle = tAngle;}}}
}

运行效果:

目前Avalonia的内容也不知道该演示什么了。估计博文会更新慢了。

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

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

相关文章

想从事数据方向职场小白看过来, 数据方面的一些英文解释

想从事数据方向职场小白看过来&#xff0c;一些英文名词解释 文章目录 想从事数据方向职场小白看过来&#xff0c;一些英文名词解释 英文类解释NoSQL&#xff1a;ESB&#xff1a;ACID &#xff1a;Data Vault&#xff1a;MDM&#xff1a;OLAP&#xff1a;SCD:SBA&#xff1a;MP…

【Django】执行查询——比较、删除、复制、批量修改对象

以下述模型为基础&#xff0c;讨论检索对象的方式方法&#xff1a; from datetime import datefrom django.db import modelsclass Blog(models.Model):name models.CharField(max_length100)tagline models.TextField()def __str__(self):return self.nameclass Author(mod…

【vue】v-if、v-show、v-for 相关所有面试题总结

v-if 和 v-show 的区别 两个重点【dom】和【生命周期】 v-if 惰性指令&#xff0c;false 不会被编译、渲染不会存在 DOM 中切换开销大&#xff0c;需要重新创建元素值变化&#xff0c;使用 v-if 的组件生命周期执行顺序 true 变为 false【组件的销毁】 beforeDestroy / befor…

[Flutter]shared_preferences基本用法以及可视化管理存储的key和value类型

shared_preferences 是一个Flutter插件&#xff0c;它提供了一种简单的方式来在应用程序中存储和获取持久化的键值对数据。它可以用于存储应用程序的配置信息、用户偏好设置、登录状态等。 使用 shared_preferences 插件&#xff0c;你可以在应用程序中轻松地保存和读取数据&a…

Java中线程相关的知识

创建子线程的三种方式: 1.自定义线程任务类继承线程类&#xff0c;以便继承其功能,重写其run方法(里面写自己需要实现的功能)&#xff0c;在main方法调用时创建其任务类实例化对象&#xff0c;然后调用对象的start方法(继承自父类)&#xff0c;即成功创建线程 优点:创建方式简…

Pandas DataFrame 基本操作实例100个

Pandas 是一个基于NumPy的数据分析模块&#xff0c;最初由AQR Capital Management于2008年4月开发&#xff0c;并于2009年底开源。Pandas的名称来源于“Panel Data”&#xff08;面板数据&#xff09;和“Python数据分析”&#xff08;data analysis&#xff09;。这个库现在由…

来不及了!大学必须完成的四件事!

老师们常说&#xff0c;上大学就轻松了 其实不然 大学不是人生的终点&#xff0c;而是新的起跑线 不是休息站&#xff0c;而是进入社会的最后冲刺跑道 大学生活苦乐参半&#xff0c;成人世界即将来临 出了校门&#xff0c;你会发现社会复杂多变&#xff0c;需要不断学习 稍…

excel中如何使用VLOOKUP和EXACT函数实现区分大小写匹配数据

在 Excel 中&#xff0c;VLOOKUP 函数默认情况下是不区分大小写的&#xff1a; 比如下面的案例&#xff0c;直接使用VLOOKUP函数搜索&#xff0c;只会搜索匹配到不区分大小写的第一个 如果我们想要实现区分大小写的精确匹配&#xff0c;可以使用 EXACT 函数结合 VLOOKUP 函数 …

【简说八股】Redisson的守护线程是怎么实现的

Redisson Redisson 是一个 Java 语言实现的 Redis SDK 客户端&#xff0c;在使用分布式锁时&#xff0c;它就采用了「自动续期」的方案来避免锁过期&#xff0c;这个守护线程我们一般也把它叫做「看门狗」线程。 Redission是一个在Java环境中使用的开源的分布式缓存和分布式锁实…

PyTorch-卷积神经网络

卷积神经网络 基本结构 首先解释一下什么是卷积&#xff0c;这个卷积当然不是数学上的卷积&#xff0c;这里的卷积其实表示的是一个三维的权重&#xff0c;这么解释起来可能不太理解&#xff0c;我们先看看卷积网络的基本结构。 通过上面的图我们清楚地了解到卷积网络和一般网…

【Javascript】设计模式之发布订阅模式

文章目录 1、现实中的发布&#xff0d;订阅模式2、DOM 事件3、简单的发布-订阅模式4、通用的发布-订阅模式5、先发布再订阅6、小结 发布—订阅模式又叫观察者模式&#xff0c;它定义对象间的一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于…

Mysql深入学习 基础篇 Ss.02 详解四类SQL语句

我亲爱的对手&#xff0c;亦敌亦友&#xff0c;但我同样希望你能成功&#xff0c;与我一起&#xff0c;站在人生的山顶上 ——24.3.1 一、DDL 数据定义语言 1.DDL —— 数据库操作 查询 查询所有数据库 show databases; 查询当前数据库 select database(); 创建 create databa…

【简说八股】Nginx、GateWay、Ribbon有什么区别?

前言 在现代的微服务架构中&#xff0c;Nginx、Gateway 和 Ribbon 都是处理网络请求和服务的组件&#xff0c;但它们各自扮演的角色和提供的功能有所不同。下面我将详细解释它们之间的区别&#xff1a; Nginx Nginx 是一个高性能的 HTTP 和反向代理服务器&#xff0c;它也可…

Golang Vs Java:为您的下一个项目选择正确的工具

Java 首次出现在 1995 年&#xff0c;由 James Gosling 和 Sun Microsystems 的其他人开发的一种新编程语言。从那时起&#xff0c;Java 已成为世界上最受欢迎和广泛使用的编程语言之一。Java 的主要特点包括其面向对象的设计、健壮性、平台独立性、自动内存管理以及广泛的内置…

MSMFN

CDFI是彩色多普勒血流成像 辅助信息 作者未提供数据

Codeforces Round 930 (Div. 2)

substr时间复杂度O&#xff08;N&#xff09;&#xff0c;不能一遍遍找&#xff0c;会超时 #include<iostream> #include<algorithm> #include<vector> #include<map> using namespace std; const int N5e510; map<string,int>mp; vector<…

[C++]AVL树怎么转

AVL树是啥 一提到AVL树&#xff0c;脑子里不是旋了&#xff0c;就是悬了。 AVL树之所以难&#xff0c;并不是因为结构难以理解&#xff0c;而是因为他的旋转。 AVL树定义 平衡因子&#xff1a;对于一颗二叉树&#xff0c;某节点的左右子树高度之差&#xff0c;就是该节点的…

5、云原生安全之falco的规则解读(部分)(上)

文章目录 1、自定义规则测试1.1、自定义检测定时任务的规则2、自带规则详解部分2.1、意外的出站连接源(类似的还有入站连接)2.2、检测目录穿越攻击2.3、rpm数据库被修改2.4、数据库派生新的进程2.5、特权容器启动2.6、启动容器挂载到敏感路径2.7、匹配所有在pod内启动、并连接…

音视频数字化(数字与模拟-照相机)

目录 1、模拟/数字 2、第一台照相机 3、照相机原理 4、取景方式 5、底片 6、数码相机 7、数码相机指标 8、数码相机分类 (1)单反相机 (2)单电相机 (3)无反相机

2024.03.02蓝桥云课笔记

1.scanf与printf取消分隔符的限制方法 示例代码&#xff1a; int main() { char s[10];scanf("%d[^\n]",s);printf("%s",s);return 0; } 运行&#xff1a; 输入&#xff1a;Hello World 输出&#xff1a;Hello World 注&#xff1a;其中[]中是一个正则…