iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >WPF利用DrawingContext实现绘制温度计
  • 182
分享到

WPF利用DrawingContext实现绘制温度计

2024-04-02 19:04:59 182人浏览 薄情痞子
摘要

WPF 使用 DrawingContext 绘制温度计 框架使用大于等于.net40; Visual Studio 2022; 项目使用 MIT 开源许可协议;

WPF 使用 DrawingContext 绘制温度计

框架使用大于等于.net40

Visual Studio 2022;

项目使用 MIT 开源许可协议;

定义Interval步长、MaxValue最大温度值、MinValue最小温度值。

CurrentGeometry 重新绘制当前刻度的Path值。

CurrentValue 当前值如果发生变化时则去重新CurrentGeometry 。

OnRender 绘制如下

  • RoundedRectangle温度计的外边框。
  • 使用方法DrawText 单字绘制 华氏温度文本Y轴变化。
  • 使用方法DrawText 单字绘制 摄氏温度文本Y轴变化。
  • 使用方法DrawText 绘制温度计两侧的刻度数值。
  • 使用方法DrawLine 绘制温度计两侧的刻度线。

实现代码

1) 准备Thermometer.cs如下:

using System;
using System.windows;
using System.Windows.Controls;
using System.Windows.Media;

namespace WPFDevelopers.Controls
{
    public class Thermometer : Control
    {
        public static readonly DependencyProperty MaxValueProperty =
            DependencyProperty.ReGISter("MaxValue", typeof(double), typeof(Thermometer), new UIPropertyMetadata(40.0));

        public static readonly DependencyProperty MinValueProperty =
            DependencyProperty.Register("MinValue", typeof(double), typeof(Thermometer), new UIPropertyMetadata(-10.0));

        /// <summary>
        ///     当前值
        /// </summary>
        public static readonly DependencyProperty CurrentValueProperty =
            DependencyProperty.Register("CurrentValue", typeof(double), typeof(Thermometer),
                new UIPropertyMetadata(OnCurrentValueChanged));

        /// <summary>
        ///     步长
        /// </summary>
        public static readonly DependencyProperty IntervalProperty =
            DependencyProperty.Register("Interval", typeof(double), typeof(Thermometer), new UIPropertyMetadata(10.0));

        /// <summary>
        ///     当前值的图形坐标点
        /// </summary>
        public static readonly DependencyProperty CurrentGeometryProperty =
            DependencyProperty.Register("CurrentGeometry", typeof(Geometry), typeof(Thermometer), new PropertyMetadata(
                Geometry.Parse(@"M 2 132.8
                              a 4 4 0 0 1 4 -4
                              h 18
                              a 4 4 0 0 1 4 4
                              v 32.2
                              a 4 4 0 0 1 -4 4
                              h -18
                              a 4 4 0 0 1 -4 -4 z")));

        /// <summary>
        ///     构造函数
        /// </summary>
        static Thermometer()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(Thermometer),
                new FrameworkPropertyMetadata(typeof(Thermometer)));
        }

        public double MaxValue
        {
            get => (double)GetValue(MaxValueProperty);

            set => SetValue(MaxValueProperty, value);
        }

        public double MinValue
        {
            get => (double)GetValue(MinValueProperty);

            set => SetValue(MinValueProperty, value);
        }

        public double CurrentValue
        {
            get => (double)GetValue(CurrentValueProperty);

            set
            {
                SetValue(CurrentValueProperty, value);

                PaintPath();
            }
        }

        public double Interval
        {
            get => (double)GetValue(IntervalProperty);

            set => SetValue(IntervalProperty, value);
        }

        public Geometry CurrentGeometry
        {
            get => (Geometry)GetValue(CurrentGeometryProperty);

            set => SetValue(CurrentGeometryProperty, value);
        }

        private static void OnCurrentValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            var thermometer = d as Thermometer;
            thermometer.CurrentValue = Convert.ToDouble(e.NewValue);
        }

        public override void OnApplyTemplate()
        {
            base.OnApplyTemplate();

            PaintPath();
        }

        protected override void OnRender(DrawinGContext drawingContext)
        {
            var brush = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#82848A"));
            var rect = new Rect();
            rect.Width = 30;
            rect.Height = 169;
            drawingContext.DrawRoundedRectangle(Brushes.Transparent,
                new Pen(brush, 2d),
                rect, 8d, 8d);

            #region 华氏温度

            drawingContext.DrawText(
                DrawingContextHelper.GetFORMattedText("华",
                    (Brush)DrawingContextHelper.BrushConverter.ConvertFromString("#82848A"), textSize: 14D),
                new Point(-49, 115));


            drawingContext.DrawText(
                DrawingContextHelper.GetFormattedText("氏",
                    (Brush)DrawingContextHelper.BrushConverter.ConvertFromString("#82848A"), textSize: 14D),
                new Point(-49, 115 + 14));


            drawingContext.DrawText(
                DrawingContextHelper.GetFormattedText("温",
                    (Brush)DrawingContextHelper.BrushConverter.ConvertFromString("#82848A"), textSize: 14D),
                new Point(-49, 115 + 28));


            drawingContext.DrawText(
                DrawingContextHelper.GetFormattedText("度",
                    (Brush)DrawingContextHelper.BrushConverter.ConvertFromString("#82848A"), textSize: 14D),
                new Point(-49, 115 + 42));

            #endregion

            #region 摄氏温度

            drawingContext.DrawText(
                DrawingContextHelper.GetFormattedText("摄",
                    (Brush)DrawingContextHelper.BrushConverter.ConvertFromString("#82848A"), FlowDirection.LeftToRight,
                    14D), new Point(75, 115));


            drawingContext.DrawText(
                DrawingContextHelper.GetFormattedText("氏",
                    (Brush)DrawingContextHelper.BrushConverter.ConvertFromString("#82848A"), FlowDirection.LeftToRight,
                    14D), new Point(75, 115 + 14));


            drawingContext.DrawText(
                DrawingContextHelper.GetFormattedText("温",
                    (Brush)DrawingContextHelper.BrushConverter.ConvertFromString("#82848A"), FlowDirection.LeftToRight,
                    14D), new Point(75, 115 + 28));


            drawingContext.DrawText(
                DrawingContextHelper.GetFormattedText("度",
                    (Brush)DrawingContextHelper.BrushConverter.ConvertFromString("#82848A"), FlowDirection.LeftToRight,
                    14D), new Point(75, 115 + 42));

            #endregion

            #region 画刻度

            var total_Value = MaxValue - MinValue;

            var cnt = total_Value / Interval;

            var one_value = 161d / cnt;

            for (var i = 0; i <= cnt; i++)
            {
                var formattedText = DrawingContextHelper.GetFormattedText($"{MaxValue - i * Interval}",
                    (Brush)DrawingContextHelper.BrushConverter.ConvertFromString("#82848A"), FlowDirection.LeftToRight,
                    14D);

                drawingContext.DrawText(formattedText,
                    new Point(43, i * one_value - formattedText.Height / 2d)); //减去字体高度的一半

                formattedText = DrawingContextHelper.GetFormattedText($"{(MaxValue - i * Interval) * 1.8d + 32d}",
                    (Brush)DrawingContextHelper.BrushConverter.ConvertFromString("#82848A"), textSize: 14D);

                drawingContext.DrawText(formattedText, new Point(-13, i * one_value - formattedText.Height / 2d));

                if (i != 0 && i != 5)
                {
                    drawingContext.DrawLine(new Pen(Brushes.Black, 1d),
                        new Point(4, i * one_value), new Point(6, i * one_value));

                    drawingContext.DrawLine(new Pen(Brushes.Black, 1d),
                        new Point(24, i * one_value), new Point(26, i * one_value));
                }
            }

            #endregion
        }

        /// <summary>
        ///     动态计算当前值图形坐标点
        /// </summary>
        private void PaintPath()
        {
            var one_value = 161d / ((MaxValue - MinValue) / Interval);

            var width = 26d;

            var height = 169d - (MaxValue - CurrentValue) * (one_value / Interval);

            var x = 2d;

            var y = 169d - (169d - (MaxValue - CurrentValue) * (one_value / Interval));


            CurrentGeometry = Geometry.Parse($@"M 2 {y + 4}
                              a 4 4 0 0 1 4 -4
                              h {width - 8}
                              a 4 4 0 0 1 4 4
                              v {height - 8}
                              a 4 4 0 0 1 -4 4
                              h -{width - 8}
                              a 4 4 0 0 1 -4 -4 z");
        }
    }
}

2) 使用ThermometerExample.xaml.cs如下:

<UserControl x:Class="WPFDevelopers.Samples.ExampleViews.ThermometerExample"
             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:wpfdev="https://GitHub.com/WPFDevelopersOrg/WPFDevelopers"
             xmlns:local="clr-namespace:WPFDevelopers.Samples.ExampleViews"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <Grid>

        <Border Background="{DynamicResource BackgroundSolidColorBrush}" 
                CornerRadius="12"
                Width="400" Height="400"
                Effect="{StaticResource NormalShadowDepth}">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition/>
                    <ColumnDefinition/>
                </Grid.ColumnDefinitions>
                <Slider x:Name="PART_Slider" IsSnapToTickEnabled="True"
                Value="10"
                Minimum="-10"
                Maximum="40" 
                Orientation="Vertical"
                Height="300"/>
                <Grid VerticalAlignment="Center"
                      Margin="160,0,0,0">
                    <Path Fill="{StaticResource PrimaryMouseOverSolidColorBrush}" 
                          Stroke="{StaticResource PrimaryMouseOverSolidColorBrush}"
                          StrokeThickness="1" Opacity=".6"
                          Data="{Binding ElementName=PART_Thermometer, Path=CurrentGeometry,Mode=TwoWay}"/>
                    <wpfdev:Thermometer x:Name="PART_Thermometer"
                                        CurrentValue="{Binding ElementName=PART_Slider,Path=Value,Mode=TwoWay}"/>
                </Grid>
                <TextBlock Text="{Binding ElementName=PART_Thermometer,Path=CurrentValue,StringFormat={}{0}℃}" 
                           FontSize="24" Grid.Column="1"
                           Foreground="{StaticResource PrimaryPressedSolidColorBrush}" FontFamily="Bahnschrift"
                           HorizontalAlignment="Center" VerticalAlignment="Center"/>
            </Grid>
        </Border>
    </Grid>
</UserControl>

实现效果

到此这篇关于WPF利用DrawingContext实现绘制温度计的文章就介绍到这了,更多相关WPF DrawingContext温度计内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: WPF利用DrawingContext实现绘制温度计

本文链接: https://www.lsjlt.com/news/168563.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • WPF利用DrawingContext实现绘制温度计
    WPF 使用 DrawingContext 绘制温度计 框架使用大于等于.NET40; Visual Studio 2022; 项目使用 MIT 开源许可协议; ...
    99+
    2024-04-02
  • WPF使用DrawingContext实现绘制刻度条
    WPF 使用 DrawingContext 绘制刻度条 框架使用大于等于.NET40;Visual Studio 2022;项目使用 MIT 开源许可协议;定义I...
    99+
    2024-04-02
  • WPF使用DrawingContext实现二维绘图
    DrawingContext比较类似WinForm中的Graphics 类,是基础的绘图对象,用于绘制各种图形,它主要API有如下几种: 绘图API 绘图API一般形为Dr...
    99+
    2024-04-02
  • WPF怎么使用DrawingContext实现二维绘图
    这篇文章主要介绍“WPF怎么使用DrawingContext实现二维绘图”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“WPF怎么使用DrawingContext实现二维绘图”文章能帮助大家解决问题。...
    99+
    2023-07-02
  • JavaScript利用el-table实现绘制热度表
    实现效果 实现代码 <div class="gray w-full h-100 mt-4 table" v-if="props.brandId"> ...
    99+
    2023-03-19
    JavaScript el-table绘制热度表 JavaScript 热度表 JavaScript el-table
  • WPF实现绘制扇形统计图的示例代码
    扇形统计图 绘制一个扇形原理也是基于Canvas进行绘制;ArcSegment[1]绘制弧形;绘制指示线;绘制文本;鼠标移入动画;显示详情Popup;源码Github[2] ...
    99+
    2024-04-02
  • WPF如何实现绘制3D图形
    今天小编给大家分享一下WPF如何实现绘制3D图形的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。关键概念视口视口指的是图像要展...
    99+
    2023-07-05
  • WPF仿LiveCharts实现饼图的绘制
    目录前言 一、PieControl.cs二、App.xaml三、MainWindow.xaml四、MainWindow.xaml.cs每日一笑 下班和实习生一起回家,公交站...
    99+
    2024-04-02
  • WPF实现绘制统计图(柱状图)的方法详解
    目录前言实现代码效果预览前言 有小伙伴提出需要实现统计图。  由于在WPF中没有现成的统计图控件,所以我们自己实现一个。 PS:有更好的方式欢迎推荐。 实现代码 一、创建...
    99+
    2024-04-02
  • 利用WPF实现Windows屏保的制作
    目录介绍正文实现代码介绍 框架使用.NET452; Visual Studio 2019; 项目使用 MIT 开源许可协议; 更多效果可以通过GitHub[1]|...
    99+
    2024-04-02
  • WPF中怎么利用amCharts绘制股票K线图
    这篇文章给大家介绍WPF中怎么利用amCharts绘制股票K线图,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。准备工作先要去这里下载amCharts Stock Chart for WPF并解压, 新建一个WPF Pr...
    99+
    2023-06-17
  • WPF+ASP.NETSignalR实现动态折线图的绘制
    目录什么是SignalRSignalR做了什么封装与集成SignalR用途官方网址和源码示例截图服务端项目创建SignalR服务端业务集成SignalR服务端配置客户端项目创建客户端...
    99+
    2023-01-03
    WPF 动态折线图 WPF 折线图 WPF SignalR 折线图
  • Python利用matplotlib实现饼图绘制
    目录前言1. 等高线图概述什么是饼图?饼图常用场景绘制等饼图步骤案例展示2. 饼图属性设置饼图的颜色设置标签设置突出部分设置填入百分比数值饼图旋转设置阴影3. 调整饼图的大小4. 添...
    99+
    2024-04-02
  • WPF实现雷达扫描图的绘制详解
    目录前言制作思路具体实现前言 实现一个雷达扫描图。 源代码在TK_King/雷达 (gitee.com),自行下载就好了 制作思路 绘制圆形(或者称之轮)绘制分割线绘制扫描范围添加...
    99+
    2024-04-02
  • 如何使用php实现华氏温度转换摄氏温度
    这篇文章给大家分享的是有关如何使用php实现华氏温度转换摄氏温度的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。php实现华氏温度转换摄氏温度的方法:1、创建一个PHP示例文件;2、通过摄氏温度与华氏温度的换算式“...
    99+
    2023-06-26
  • WPF怎么实现雷达扫描图的绘制
    这篇文章主要介绍了WPF怎么实现雷达扫描图的绘制的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇WPF怎么实现雷达扫描图的绘制文章都会有所收获,下面我们一起来看看吧。制作思路绘制圆形(或者称之轮)绘制分割线绘制扫...
    99+
    2023-06-30
  • WPF开发之利用DrawingVisual绘制高性能曲线图
    前言 项目中涉及到了心率检测,而且数据量达到了百万级别,通过WPF实现大数据曲线图时,尝试过最基础的Canvas来实现,但是性能堪忧,而且全部画出来也不实际。同时也尝试过找第三方的开...
    99+
    2024-04-02
  • WPF实现绘制3D图形的示例代码
    目录关键概念视口相机光源材质3D对象命中测试(鼠标交互)3D对象中2D控件渲染外部导入3D模型WPF的3D功能可以在不编写任何c#代码的情况下进行绘制,只需要使用xaml即可完成3D...
    99+
    2023-03-02
    WPF绘制3D图形 WPF 3D图形 WPF 3D
  • WPF+WriteableBitmap实现高性能曲线图的绘制
    目录一、前言二、正文三、运行效果一、前言 之前分享过一期关于DrawingVisual来绘制高性能曲线的博客,今天再分享一篇通过另一种方式来绘制高性能曲线的方法,也就是通过Write...
    99+
    2022-11-13
    WPF WriteableBitmap绘制曲线图 WPF WriteableBitmap 曲线图 WPF WriteableBitmap
  • 利用Python实现热力图的绘制
    目录1. 引言2. 读取图像3. 图像灰度化4. 像素化效果5. 为热力图选择调色板1. 引言 热力图,是一种通过对色块着色来显示数据的统计图表。绘图时,需指定颜色映射的规则。例如,...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作