添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
儒雅的企鹅  ·  ReplicaSet | Kubernetes·  1 年前    · 
英姿勃勃的白开水  ·  JavaScript ...·  1 年前    · 
爱听歌的凉面  ·  javascript内容改变 ...·  2 年前    · 

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

image

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中文官方文档

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

image

图表库

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 );

}

}

});

}

}

image

更多使用方法见 官方网站

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


[WPF]WPF Data Virtualization和UI Virtualization
原文:[WPF]WPF Data Virtualization和UI Virtualization 这篇博客将介绍WPF中的虚拟化技术。 1. Data Virtualization 通常情况下我们说数据虚拟化是指数据源没有完全加载,仅加载当前需要显示的数据呈现给用户。
原文 WPF 同一窗口内的多线程/多进程 UI(使用 SetParent 嵌入另一个窗口) WPF 的 UI 逻辑只在同一个线程中,这是学习 WPF 开发中大家几乎都会学习到的经验。如果希望做不同线程的 UI,大家也会想到使用另一个窗口来实现,让每个窗口拥有自己的 UI 线程。
原文 WPF 多线程 UI:设计一个异步加载 UI 的容器 对于 WPF 程序,如果你有某一个 UI 控件非常复杂,很有可能会卡住主 UI,给用户软件很卡的感受。但如果此时能有一个加载动画,那么就不会感受到那么卡顿了。
原文:WPF的UI虚拟化 许多时候,我们的界面上会呈现大量的数据,如包含数千条记录的表格或包含数百张照片的相册。由于呈现UI是一件开销比较大的动作,一次性呈现数百张照片就目前的电脑性能来说是需要占用大量内存和时间的。
原文:使用WPF来创建 Metro UI程序 这个是我以前网上看到的一篇文章,原文地址是:Building a Metro UI with WPF,这篇文章一步步的介绍了如何实现一个Metro样式的窗口,并且效果非常好。
原文:WPF如何实现一个漂亮的页签导航UI      最近看到一个比较漂亮的UI主界面,该UI是用左边的页签进行导航,比较有特色,就想着尝试用WPF来实现一下。经过一番尝试,基本上将UI设计图的效果用WPF程序进行了实现。
版权声明:本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:http://blog.csdn.net/wpwalter/),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。
原文:WPF之UI虚拟化 在WPF应用程序开发过程中,大数据量的数据展现通常都要考虑性能问题。有下面一种常见的情况:原始数据源数据量很大,但是某一时刻数据容器中的可见元素个数是有限的,剩余大多数元素都处于不可见状态,如果一次性将所有的数据元素都渲染出来则会非常的消耗性能。
原文:WPF异常捕获三种处理 UI线程, 全局异常,Task异常 protected override void OnStartup(StartupEventArgs e){base.OnStartup(e);RegisterEvents();} private void RegisterEvents(){//TaskScheduler.
原文:OpenExpressApp:精通 WPF UI Virtualization     本篇博客主要说明如何使用 UI Virtualization(以下简称为 UIV) 来提升 OEA 框架中 TreeGrid 控件的性能,同时,给出了一些学习 UIV 的资源。
原文:WPF MVVM UI分离之《交互与数据分离》 在我们使用WPF过程中,不可避免并且超级喜欢使用MVVM框架。 那么,使用MVVM的出发点是视觉与业务逻辑分离,即UI与数据分离 诸如下面的问题: 删除操作,假如需要先执行一部分数据的处理,然后删除界面列表中的子项,之后再执行其它数据的处理。