如何解决如何确定LiveCharts轴的轴大小以像素为单位,以便确定轴上自定义的分隔符步数?
我正在使用LiveCharts的WinForms版本在.NET应用程序中以Lineseries形式绘制一系列数据。我希望能够根据像素的轴长来调整X轴上显示的“勾号”的数量。到目前为止,我还无法确定轴的实际长度。在运行时检查时,Axis
对象具有Height
的{{1}}和Width
,因此我的方法无法计算正确的滴答数(或步数)。>
所以,我的问题是,如何获得NaN
对象的正确大小(如屏幕所示,以像素为单位)?
到目前为止,我的代码:
调用Axis
类方法的Form方法可根据所需的像素间距和在轴上设置刻度间距来获取刻度数量:
Chart
在private static void UpdateChainageTickSpacing()
{
Axis chainageAxis = Chart.GetAxisByName(AxisOrientation.X,"Chainage");
int numTicks = Chart.GetNumTicksByPixelSpacing(chainageAxis,40);
Chart.SetTickSpacing(chainageAxis,numTicks,0);
}
类中:
Chart
解决方法
该图表有两个Canvas
元素:父Canvas
包含图例(如图例,节等),另一个子Canvas
作为实际绘制区域,用于承载绘制的图形。
轴长(x和y)等于绘图区域的尺寸(宽和高)。
您可以通过Canvas
属性引用父项CartesianChart.Content
来访问绘图画布:
您需要等到所有元素都添加到绘图画布后才能获得最终尺寸。
图表本身不会公开通知内容布局完成的事件。因此,您必须收听绘图画布的UIElement.LayoutUpdated
事件。
要实现此目的,您需要从Canvas.LayoutUpdated
或Window.ContentRendered
事件处理程序中订阅Window.Loaded
事件。由于您希望忽略尽可能多的冗余布局更新,因此在这种情况下,最先引发的Window.ContentRendered
事件是最好的。
UIElement.LayoutUpdated
在每次布局传递(例如调整大小)或Canvas.Children
收集操作(例如添加/移动/删除子元素)期间都会提高,这很常见,因此需要进行一些优化以减少多余的重新计算。
MainWindow.xaml
<Window>
<CartesianChart x:Name="Chart" />
</Window>
MainWindow.xaml.cs
partial class MainWindow: Window
{
public MainWindow()
{
InitializeComponent();
this.ContentRendered += OnContentRendered;
}
private void OnContentRendered(object sender,EventArgs e)
{
this.ContentRendered -= OnContentRendered;
var canvas = this.Chart.Content as Canvas;
var plotCanvas = canvas.Children.OfType<Canvas>().FirstOrDefault();
plotCanvas.LayoutUpdated += GetAxisXLengthOnLayoutUpdated;
}
// Will be called very often
// (on every layout pass of the Canvas sender like on resize or add/move/remove child)
private void GetAxisXLengthOnLayoutUpdated(object sender,EventArgs e)
{
var plotCanvas = sender as Canvas;
// If this is a one time operation,unsubscribe from LayoutUpdated event
plotCanvas.LayoutUpdated -= GetAxisXLengthOnLayoutUpdated;
// The length of the x-axis is equal to the final width of the plot area
var actualAxisXLength = plotCanvas.ActualWidth;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。