一、概要

解决问题--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. PHP ftruncate() 函数

    定义和用法 ftruncate() 函数把打开文件截断到指定的长度. 如果成功则返回 TRUE,如果失败则返回 FALSE. 语法 ftruncate(file,size) 参数 描述 file 必需 ...

  2. PHP fread() 函数

    定义和用法 fread() 函数读取打开的文件. 函数会在到达指定长度或读到文件末尾(EOF)时(以先到者为准),停止运行. 该函数返回读取的字符串,如果失败则返回 FALSE. 语法 string ...

  3. PHP unserialize() 函数

    unserialize() 函数用于将通过 serialize() 函数序列化后的对象或数组进行反序列化,并返回原始的对象结构. PHP 版本要求: PHP 4, PHP 5, PHP 7高佣联盟 w ...

  4. PHP lcg_value() 函数

    实例 返回范围为 (0, 1) 的一个伪随机数: <?phpecho lcg_value();?>高佣联盟 www.cgewang.com 定义和用法 lcg_value() 函数返回范围 ...

  5. 使用idea maven打包项目 Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.0.2:resources

    超级折磨人 在网上搜到的解决方案: 技术交流群 : 816227112 修改 和 <plugin> <groupId>org.apache.maven.plugins</ ...

  6. Gradient Centralization: 简单的梯度中心化,一行代码加速训练并提升泛化能力 | ECCV 2020 Oral

    梯度中心化GC对权值梯度进行零均值化,能够使得网络的训练更加稳定,并且能提高网络的泛化能力,算法思路简单,论文的理论分析十分充分,能够很好地解释GC的作用原理   来源:晓飞的算法工程笔记 公众号 论 ...

  7. Eclipse RCP:多平台部署

    1 问题 在使用Eclipse RCP IDE进行开发时,它自带的PDE(插件开发环境)工具仅能够导出相同平台的部署包,比如win32的仅能导出win32的,linux64仅能够导出linux64的. ...

  8. UIPickView的简单使用

    好记性不如烂笔头,勤做笔记. 摘要: 1.UIPickVIew 几个重要的属性 (1)datePickerMode UIDatePickerModeTime, // Displays hour, mi ...

  9. nginx多个server的配置,同一端口

    nginx多个server的配置,同一端口 #user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/e ...

  10. 【av68676164(p23-p24)】临界区和锁

    4.4.1 临界资源和临界区 临界资源(Critical Resource) 一次只允许一个进程独占访问(使用)的资源 例:例子中的共享变量i 临界区(Critical Section) 进程中访问临 ...