如何获取LiveCharts笛卡尔图表中点的窗口坐标系像素坐标?
解决LiveCharts WPF笛卡尔图表ConvertToPixels返回(0,0)的问题
问题根源
ConvertToPixels始终返回(0,0),核心原因是调用时机过早——图表还未完成渲染,内部布局测量、坐标轴映射逻辑未初始化;或是未正确指定转换对应的坐标轴。
解决方案
1. 等待图表渲染完成后调用方法
WPF控件需在Loaded事件触发后才完成布局计算,因此要在图表或窗口的Loaded事件中执行坐标转换,而非构造函数内直接调用。
2. 正确使用ConvertToPixels方法
转换时需明确指定目标X/Y轴,注意:当X轴使用Labels分类轴时,X值对应标签的索引(从0开始),而非标签文本。
完整修改后的VB.NET代码
Imports LiveCharts Imports LiveCharts.Wpf Class MainWindow Public Sub New() InitializeComponent() Dim seriesCollection As New SeriesCollection From { New LineSeries With { .Title = "系列1", .Values = New ChartValues(Of Double) From {4, 6, 5, 2, 7} }, New LineSeries With { .Title = "系列2", .Values = New ChartValues(Of Double) From {6, 7, 3, 4, 6} } } cartesianChart1.Series = seriesCollection cartesianChart1.AxisX.Add(New Axis With { .Title = "X轴", .Labels = {"1", "2", "3", "4", "5"} }) cartesianChart1.AxisY.Add(New Axis With { .Title = "Y轴", .LabelFormatter = Function(value) value.ToString() }) ' 绑定图表加载完成事件 AddHandler cartesianChart1.Loaded, AddressOf OnChartLoaded End Sub Private Sub OnChartLoaded(sender As Object, e As RoutedEventArgs) ' 示例:转换系列1中第3个点(索引2,对应X标签"3",Y值5) Dim xAxis = cartesianChart1.AxisX(0) Dim yAxis = cartesianChart1.AxisY(0) ' 分类轴的X值为标签索引 Dim chartPoint = New ChartPoint(2, 5) ' 获取图表内部像素坐标 Dim chartPixel = cartesianChart1.ConvertToPixels(chartPoint, xAxis, yAxis) ' 转换为窗口坐标系 Dim windowPoint = cartesianChart1.PointToScreen(chartPixel) ' 输出结果 MessageBox.Show($"图表内像素坐标:({chartPixel.X}, {chartPixel.Y}) 窗口坐标系坐标:({windowPoint.X}, {windowPoint.Y})") End Sub End Class
关键注意事项
- 调用时机:必须在控件
Loaded事件触发后执行,此时图表已完成布局,坐标轴的范围和映射关系已初始化。 - 分类轴X值规则:使用
Labels的X轴,X坐标对应标签的索引(从0开始),而非标签的文本内容。 - 坐标系转换:
ConvertToPixels返回的是图表控件内部的相对坐标,需通过PointToScreen方法转换为窗口/屏幕坐标系。
内容的提问来源于stack exchange,提问作者Apollo11Mission
相关产品推荐
相关产品推荐

