WPF常用UI库和图标库(MahApps、HandyControl、LiveCharts)_步、步、为营的博客-程序员秘密

技术标签: ui  WPF  wpf  

WPF常用UI库和图表库(MahApps、HandyControl、LiveCharts)

WPF有很多开源免费的UI库,本文主要介绍常见的MahApps、HandyControl两个UI库;在开发过程中经常会涉及到图表的开发,本文主要介绍LiveCharts开源图表库。

UI库

第三方UI库的使用一般都是三步:

  1. Nuget安装
  2. 在APP.xaml中增加资源
<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="..........xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>
  1. 在MainWindow.xaml中引用命名空间xmlns:xxxx="xxxxxxx"

MahApps

MahApps.Metro官方网站

  1. Nuget安装MahApps.Metro
  2. App.xaml中增加
<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Controls.xaml" />
    <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Fonts.xaml" />
    <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Themes/Light.Blue.xaml" />
</ResourceDictionary.MergedDictionaries>
  1. 在MainWindow.xaml中引用命名空间xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls"

该UI库不仅扩展了很多扩展控件,还对原生的控件进行了美化。看一个简单案例

<mah:MetroWindow x:Class="Zhaoxi.MahAppsApp.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:Zhaoxi.MahAppsApp"
        xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls"
        mc:Ignorable="d" FontSize="20" WindowStartupLocation="CenterScreen"
        Title="MainWindow" Height="450" Width="800">
    <mah:MetroWindow.LeftWindowCommands>
        <mah:WindowCommands>
            <Button Content="A"/>
        </mah:WindowCommands>
    </mah:MetroWindow.LeftWindowCommands>
    <mah:MetroWindow.RightWindowCommands>
        <mah:WindowCommands>
            <Button Content="B"/>
            <Button Content="C"/>
            <Button Content="D"/>
            <Button Content="E"/>
        </mah:WindowCommands>
    </mah:MetroWindow.RightWindowCommands>
    <Grid>
        <StackPanel>
            <Button Content="Button" Width="200" Height="30" Style="{
        StaticResource MahApps.Styles.Button.Hamburger}"/>
            <TextBox Text="Hello" Width="200"/>
            <TabControl>
                <TabItem Header="AAA"/>
                <TabItem Header="BBB"/>
                <TabItem Header="CCCC"/>
                <TabItem Header="DDDD"/>
            </TabControl>
            <mah:MetroTabControl>
                <mah:MetroTabItem Header="AAA" CloseButtonEnabled="True"/>
                <mah:MetroTabItem Header="AAA" CloseButtonEnabled="True"/>
                <mah:MetroTabItem Header="AAA"/>
                <mah:MetroTabItem Header="AAA"/>
                <mah:MetroTabItem Header="AAA"/>
            </mah:MetroTabControl>
           
            <mah:FlipView BannerText="Hello" IsBannerEnabled="False">
                <mah:FlipViewItem Height="100" Width="300">
                    <Border Background="Orange"/>
                </mah:FlipViewItem>
                <mah:FlipViewItem Height="100" Width="300">
                    <Border Background="Green"/>
                </mah:FlipViewItem>
            </mah:FlipView>
            
        </StackPanel>
    </Grid>
</mah:MetroWindow>

因为涉及到了窗体,所以在后台类中需要继承MetroWindow

img

HandyControl

使用方法类似,Nuget安装HandyControl

App.xaml中引入

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/HandyControl;component/Themes/SkinDefault.xaml"/>
            <ResourceDictionary Source="pack://application:,,,/HandyControl;component/Themes/Theme.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

HandyOrg中文官方文档

官方网站上详细介绍了各控件的使用方法和控件的展示效果,并且网站是中文的十分友好,详细使用说明直接查看官网即可。

img

图表库

Nuget包安装LiveCharts.Wpf

引入命名空间xmlns:lvc="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Wpf"

<Grid>
    <lvc:CartesianChart DisableAnimations="False" Zoom="Xy">
        <lvc:CartesianChart.Series>
            <lvc:LineSeries ScalesYAt="1" Values="{Binding Values}" />
            <lvc:ColumnSeries Values="{Binding Values2}" />
        </lvc:CartesianChart.Series>
        <lvc:CartesianChart.AxisX>
            <lvc:Axis
                Title="时间"
                Labels="{Binding xLabels}"
                LabelsRotation="-45">
                <lvc:Axis.Separator>
                    <lvc:Separator Step="1" />
                </lvc:Axis.Separator>
            </lvc:Axis>
        </lvc:CartesianChart.AxisX>
        <lvc:CartesianChart.AxisY>
            <lvc:Axis
                Title="温度"
                MaxValue="100"
                MinValue="0">
                <lvc:Axis.Separator>
                    <lvc:Separator Step="10" />
                </lvc:Axis.Separator>
            </lvc:Axis>
            <lvc:Axis
                Title="压力"
                MaxValue="100"
                MinValue="0"
                Position="RightTop">
                <lvc:Axis.Separator>
                    <lvc:Separator Step="10" />
                </lvc:Axis.Separator>
            </lvc:Axis>
        </lvc:CartesianChart.AxisY>
    </lvc:CartesianChart>
</Grid>

ModelView

public class MainViewModel
{
    
    public ChartValues<double> Values {
     get; set; }
    public ChartValues<double> Values2 {
     get; set; }

    public ObservableCollection<string> xLabels {
     get; set; }
    public MainViewModel()
    {
    
        Values = new ChartValues<double>();
        Values2 = new ChartValues<double>();
        xLabels = new ObservableCollection<string>();
        Random random = new Random();

        Task.Factory.StartNew(async () =>
        {
    
            while (true)
            {
    
                await Task.Delay(1000);
                Values.Add(random.Next(10, 80));
                Values2.Add(random.Next(10,90));
                xLabels.Add(DateTime.Now.ToString("mm:ss"));

                if (Values.Count > 50)
                {
    
                    Values.RemoveAt(0);
                    Values2.RemoveAt(0);
                    xLabels.RemoveAt(0);
                }

            }
        });
    }
}

img

更多使用方法见官方网站

LiveCharts满足基本的需求,但是如果数据量较大的话,性能会大打折扣,如果追求性能可以使用下ScottPlot开源库,但是该库某些功能没有实现。如果对性能有较高的要求,也可以使用LightningChart.NET,不过这是收费的组件库。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44064908/article/details/128956210

智能推荐

Xtool X100 PAD2 Error Code 5 Data Not Exist Solution_abc1294211669的博客-程序员秘密

If your XTOOL X100 Pad2 gives your error ” GetUpdateListEx: Error code= 5. Data doesn’t exist.”, which means your 2-year free update online service is due.Need to pay for new updates subscription expires after 2 years.https://xtooltools.blogspot.com/202

请输入一个字符串s和两个正整数m和n,将字符串s中从第m个字符开始的n个字符复制到字符串s中,再输出字符串。要求用字符指针定义并调用函数strcopy(s,m,n),它的功能是将字符串s中从第m个字_jueduiwudi6的博客-程序员秘密

#include&amp;lt;stdio.h&amp;gt;#include&amp;lt;string.h&amp;gt;void strcopy(char *s,int m,int n){ char *p,*q; for(q=s,p=s+n-1;p&amp;lt;s+m+n-1;p++,q++) *q=*p; *q='\0';}int main(){ char str[20]; int m=3,n...

超详细JDK下载与安装步骤_jdk下载与安装教程_最爱吃鱼罐头的博客-程序员秘密

无论在我们开始学习Java或者入职第一天安装环境,这个你都是必备滴!下面是下载和安装JDK的教程

PHP画像素直线,PHP绘制图像_霍冉的博客-程序员秘密

在 PHP 中绘制图像的函数非常丰富,包括点、线、各种几何图形等可以想象出来的平面图形,都可以通过 PHP 中提供的各种画图函数完成。无论是多么复杂的图形都是在这些最基本的图形基础上进行深化的,只有掌握了最基本图形的绘制方法,才能够绘制出各种具有独特风格的图形。使用 PHP 绘制一个图像通常需要以下 4 个步骤:创建一个背景图像,以后所有操作都是基于此背景;在图像上绘图轮廓或者输入文本;输出最终图...

Linux配置DNS永久生效_linux系统配置长久nds_Iris.Li的博客-程序员秘密

一、背景公司生产环境服务部署在了云上,DNS服务器一共配置了三台(IP地址我虚拟的):第一台DNS服务器是云上一台虚拟机10.0.0.1,不能链接外网第二台DNS服务器部署在线下机房172.16.0.1,可以连接外网第三台DNS服务器部署在线下机房172.16.0.2,可以连接外网云上服务器可以通过VPN连通线下机房,即当需要解析外网域名时,第一台机器会去找第二台/第三台机器二、故障物业停电没通知我们,导致机房空调坏了,温度过高导致线下DNS宕机了,VPN也断掉了。当生产环境访问外网域名时

实现线上高性能接口方案nginx负载tornado后端lua数据_weixin_33834679的博客-程序员秘密

最近实现了一个http的接口 ~ http的方式,访问结果为json nginx做负载,web分离,url转发 ~tornado做数据操作和异步调用lua的接口 ~memcached做session的共享 (为啥不用redis做session,一方面是为了不和redis有kv冲突,服务器的中断冗余,更主要的方面是用redis存储session我没有做出来,郁闷呀。。。。)redis做kv数据库和队...

随便推点

自己笔记本电脑的svn server 用户名密码_杭州丹尼的博客-程序员秘密

danny/123456安装了visual svn之后 就能设置密码了

golang,Python,我们该怎么选_golang还是python_SMILY12138的博客-程序员秘密

在这些编程语言中,Go语言和Python语言都属于高级编程语言,它们在不同领域和场景下有着广泛的应用。本文将从以下几个方面对Go语言和Python进行优缺点对比:速度、并发处理、强类型、学习曲线、库支持、多用途性、社区支持、可移植性、性能调优等。综上所述,Golang和Python都有自己独特的优缺点,并且适用于不同的场景。相反,Python属于解释型语言,因此它的性能调优需要使用一些特殊的技巧和工具。在选择一种编程语言时,不仅要考虑它的优缺点,还要考虑其他因素,如可维护性、团队成员技能、部署效率等。

俄罗斯方块代码 java_俄罗斯方块java代码-java编写俄罗斯方块代码详解分享_靚兔的博客-程序员秘密

俄罗斯方块——java源代码提供import java.awt.*; import java.awt.event.*; //俄罗斯方块类 public class ERS_Block extends Frame{ public static boolean isPlay=false; public .我写俄罗斯方块的时候,添加键盘监听,为什么总是监听不到,但是把frame。我的理解:你应该是在F...

网站服务器带宽2m怎么样,云服务器2m带宽够用吗_Penini的博客-程序员秘密

云服务器2m带宽够用吗 内容精选换一换SAP HANA运行在HANA云服务器上,需创建两台HANA云服务器,用于部署SAP HANA软件。根据界面提示配置参数,确认填写信息无误之后,阅读并勾选《华为镜像免责声明》,然后单击“立即购买”,完成SAP HANA主节点云服务器的创建。创建SAP HANA备节点创建步骤与SAP HANA主节点的创建基本一样,主要的区别就在于创建备节点弹性云服务器创建成功后...

FM ALV REUSE_ALV_GRID_DISPLAY_LVC 标准状态栏代码_lvc alv 的状态栏参考类型_JohnMin的博客-程序员秘密

%ML               Folder                                     %PC               Local file...                              %SC               Find                                      

Python实现微信支付(三种方式)_http://101.35.50.63:84/goods/createrandomqrcode?ra_东木月的博客-程序员秘密

Python实现微信支付(三种方式)一、准备环境###1、要有微信公众号,商户平台账号https://pay.weixin.qq.com/wiki/doc/api/index.html2、支持的支付方式有3、备案域名选择扫码支付,如果使用模式二则不需要域名,只需要可访问的ip地址就行。4、建一个Django项目。一、扫码支付点击“扫码支付”按官方文档配置好回调url(具体如何...

推荐文章

热门文章

相关标签