一、概要

解决问题--ChartControl不等距x轴显示

二、CS代码

用过ChartControl的开发者们应该都知道,ChartControl中设置x轴间距间隔都是固定的数值。

比如(间隔1000)数值为:

0 1000 2000 3000 4000

  <dxc:AxisY2D.WholeRange>
<dxc:Range
MaxValue="0"
MinValue="4000"
SideMarginsValue="0" />
</dxc:AxisY2D.WholeRange>

但是,当ChartControl中的某一条数值很小例如值为3,如果不转换的话几乎在控件中看不到用户体验非常不好,解决方案就是实现不等距x轴来显示。

间隔数值可以按照自己的想法来,本文章的数值为:

0 10 100 1000 4000

如果数值设置为不等距,当ChartControl中的某一条数值很小例如值为3的时候,这时候3的数值就可以在0到10这个区间完美显示如图【图a-1】

理想是美好的,那么问题来了,控件实际的间距是固定值1000 而显示间距是0到10这时候怎么转换有人会想0到10的这个域中的值乘以100不就可以满足情况了吗。

是的,这样做可以。但是这个做法非常不科学,因为后面的三个域中的值倍数就不能这么算了。

这时候怎么解决呢?需要用到高中的数学知识分段函数。

公式如下:

附加值:(总长度*当前段数 / 段数)  第一段附加值为0

((实际值 - 域下限) / (域上限 - 域下限))*(总长度 / 段数)+ 附加值

到这里为止,可能只能大概知道这个公式是个什么情况,但是还是不知道具体为什么要这么算。我们接下来在代码中深入了解。

三、xaml代码

1.修改ChartControl  x轴的显示数值(转换)

 <local:UpAndDownLabelConverter x:Key="xconv" />
  <DataTemplate x:Key="AxisYLabelTemplate">
<ContentPresenter Content="{Binding Path=Content, Converter={StaticResource xconv}}" />
</DataTemplate>
<dxc:AxisY2D.Label>
<dxc:AxisLabel
ElementTemplate="{StaticResource AxisYLabelTemplate}"
Visibility="Visible"
Visible="True">
<dxc:Axis2D.ResolveOverlappingOptions>
<dxc:AxisLabelResolveOverlappingOptions AllowHide="False" />
</dxc:Axis2D.ResolveOverlappingOptions>
</dxc:AxisLabel>
</dxc:AxisY2D.Label>

四、算法

  /// <summary>
/// 推算出显示值
/// </summary>
/// <param name="xValue">X轴数值</param>
/// <param name="minRange">域下限</param>
/// <param name="maxRange">域上限</param>
/// <param name="totalLength">总长度</param>
/// <param name="period">分了几段</param>
/// <returns></returns>
private static double RangeCalculate(double xValue, double minRange, double maxRange,double totalLength = 4000.0,int period = )
{
//实际值 需要转化的实际值
//域上限 0-10 ,10为上限
//域下限 0-10 ,0为下限
//总长度=X轴的上限。例:0 10 100 1000 4000,4000为总长度
//段数:分了几段 例:0-10,10-100,100-1000,1000-4000 分为4段
//当前段数:0-10 第1段 , 10-100 第2段 , 100-1000第3段 ,1000-4000第4段
//段附加值:(总长度 * 当前段数 / 段数) ps:第一段,段附加值为0。附加值是为了值平均
//分段函数公式:((实际值 - 域下限) / (域上限 - 域下限))*(总长度 / 段数)+ 段附加值 double x = 0.0; if ( < xValue && xValue <= )
{
x = ((xValue - minRange) / (maxRange - minRange)) * (totalLength / period) + ;
}
if ( < xValue && xValue <= )
{
x = ((xValue - minRange) / (maxRange - minRange)) * (totalLength / period) + (totalLength * / period);
}
if ( < xValue && xValue <= )
{
x = ((xValue - minRange) / (maxRange - minRange)) * (totalLength / period) + (totalLength * / period);
}
if ( < xValue && xValue <= )
{
x = ((xValue - minRange) / (maxRange - minRange)) * (totalLength / period) + (totalLength * / period);
}
return x;
}

五、Convert

    public class NotEquidistantLabelConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
int target = ; int.TryParse(value.ToString(), out target); if (target <= )
return ;
else if (target <= )
return ;
else if (target <= )
return ;
else if (target <= )
return ;
else if (target <= )
return ;
return string.Empty;
} public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}

WPF Devexpress控件库中ChartControl--实现不等距x轴的更多相关文章

  1. WPF Devexpress 控件库中ChartControl 实现股票分时走势图

    概要 从事金融行业开发 ,会接触些图表控件,这里我分享一下自己基于DevExpress.Charts.v16.2开发的股票分时走势图的经验. 附上源码:点击跳转 如果需要讨论,Q群:580749909 ...

  2. DevExpress控件库 开发使用经验总结3 制作项目安装包

    2015-01-27 使用DevExpress控件包开发C/S项目完成后,部署前需要制作本地安装包.本文还是使用“SetupFactory”安装工厂来制作安装包.在以前的系列文章中详细介绍过该工具的使 ...

  3. WindowsXamlHost:在 WPF 中使用 UWP 控件库中的控件

    在 WindowsXamlHost:在 WPF 中使用 UWP 的控件(Windows Community Toolkit) 一文中,我们说到了在 WPF 中引入简单的 UWP 控件以及相关的注意事项 ...

  4. DevExpress控件库 开发使用经验总结1 DevExpress简介、安装、使用

    2015-01-24 最近公司开发的WinForm客户端图书行业ERP管理系统,界面端采用了DevExpress控件库.界面效果非常绚丽,类似于Office2007.2010的界面风格. 其中的控件功 ...

  5. Winform DevExpress控件库(一) DevExpress控件库的安装与新建第一个DevExpress项目

    前言:因为这段时间要接触到DevExpress控件库,而我本身甚至对winform的控件都了解甚少,所以处在学习中,写下博客主要是为了方便后期的回顾,当然也可以给一些新人第一次接触时做为学习的参考,以 ...

  6. DevExpress控件库 开发使用经验总结2 DevExpress汉化之WinForm开发模式汉化

    2015-01-24 DevExpress控件库默认安装后,使用的本地资源为英文.Developer Express .NET产品都有本地化资源,比如按钮属性,控件属性描述,菜单项,确认和错误的信息等 ...

  7. DevExpress控件GridControl中的布局详解 【转】

    DevExpress控件GridControl中的布局详解 [转] 2012-10-24 13:27:28|  分类: devexpress |  标签:devexpress  |举报|字号 订阅   ...

  8. WPF 免费控件库

    https://github.com/Infragistics/InfragisticsThemesForMicrosoftControls 几款WPF免费控件库,不过运行源码时需要下载三个DLL , ...

  9. C# WPF开源控件库:MahApps.Metro

    其实站长很久之前就知道这个开源WPF控件库了,只是一直欣赏不了这种风格,但也star了该项目.每次浏览该仓库时,发现star越来越多,也看到很多网友对它的褒奖,所以今天就向大家推荐这款WPF控件库. ...

随机推荐

  1. SpringBoot+Shiro+JWT前后端分离实现用户权限和接口权限控制

    1. 引入需要的依赖 我使用的是原生jwt的依赖包,在maven仓库中有好多衍生的jwt依赖包,可自己在maven仓库中选择,实现大同小异. <dependency> <groupI ...

  2. charles抓取HTTPS设置,详细踩坑版

    写这篇文章的背景就是,每次我在一台新电脑上用charles抓包时,总是因为各种原因无法抓到https请求,每个百度出来的回答又不是那么详细,需要通过几篇回答才能解决过程中的各种问题,所以把自己的安装经 ...

  3. datagrip安装与破解

    datagrip下载 从官网下载的dataGrip可以免费使用30天,如果已经破解过或者付费过的小伙伴可以跳过这个章节.对于未安装软件的小伙伴,博主这里收集了dataGrip的破解教程,扫描底部博主的 ...

  4. 微信小程序订阅消息调研

    相关资料 背景:微信模板消息已正式下架,改为订阅消息,详情如下: 服务变更通知 订阅消息:订阅消息相关内容如下: 订阅消息 接口设计 获取接口访问凭证 :根据appId和secret获取接口访问凭证a ...

  5. 解决IIS发布时CS0016未能写入输出文件错误

    今天遇到一个将asp.net项目部署到IIS后访问的时候报的一个错误: 在网上查询了相关资料后,解决方法如下: 找到C:\Windows\下的temp文件,右键属性>安全>编辑,给其中II ...

  6. 从零写一个Asp.net core手脚架 (异常处理)

    既然是手脚架,那么肯定得明白,手脚架是有限资源的一个整合,我们尽可能完善它,并保留可扩展性才是最终目的,尽可能减少硬编码,让业务不满足的情况下,可以自行修改 我们把解决方案取名Asp.netCoreT ...

  7. Python格式化字符串(f,F,format,%)

    # 格式化字符串: 在字符串前加上 f 或者 F 使用 {变量名} 的形式来使用变量名的值 year = 2020 event = 'Referendum' value = f'Results of ...

  8. python1.3集合知识点:

    #定义集合:{},集合是只有key没有value的字典,集合内元素不能重复!a={1,2,3,4,5,6}#列表转换成集合b=set([1,2,3,4,5])print(a,b) #集合对列表进行去重 ...

  9. 从零搭建Spring Boot脚手架(2):增加通用的功能

    1. 前言 今天开始搭建我们的kono Spring Boot脚手架,首先会集成Spring MVC并进行定制化以满足日常开发的需要,我们先做一些刚性的需求定制,后续再补充细节.如果你看了本文有什么问 ...

  10. DCGAN实现

    DCGAN实现 代码 dcgan.py #!/usr/bin/env python # -*- coding: utf-8 -*- import os import math import argpa ...