[C# LiveChart] AxesCollection(AxisX, AxisY), VisualElement를 Add 할 때 NullReferenceException
LiveChart에 VisualElement를 추가하는 코드입니다.
Y축 간격을 재 설정하고, Y축에 평행한 선과 "X Line"이라는 글자를 삽입하겠습니다.
1. 기존 Chart의 AxisY와 VisualElements를 Clear() 하여 초기화 해줍니다.
public LiveCharts.WinForms.CartesianChart Graph;
Graph.AxisY.Clear();
Graph.VisualElements.Clear();
2. Y축 간격을 재 설정 합니다.
Graph.AxisY.Add(new Axis
{
Name = "Name",
Title = "Title",
Foreground = System.Windows.Media.Brushes.Black,
Separator = new LiveCharts.Wpf.Separator
{
Step = 1,
}
});
3. Y축에 평행한 선과 "X Line"이라는 Text value를 가진 UIElement를 그래프에 Add 합니다.
[NullReferenceException]
Graph.VisualElements.Add(new VisualElement
{
X = 0.5,
Y = 0,
HorizontalAlignment = HorizontalAlignment.Center,
VerticalAlignment = VerticalAlignment.Top,
UIElement = new TextBlock
{
Foreground = Brushes.Blue,
Text = "X Line",
FontSize = 12,
Opacity = 0.6
}
});
이때, UIElement에서 NullReferenceException이 발생합니다. UIElement 속성을 주석 처리 후 해당 코드를 수행하면 NullReferenceException이 발생하지 않습니다.
관련 글을 열심히 찾아보고 NullReferenceException을 해결하였는데요, AxesCollection 쪽에 버그가 있다는 사실을 알게 되었습니다. (해당 사이트는 하단에 기재하였습니다. :) )
해당 글에 따르면, Chart의 AxesCollection을 Clear 한 후 새로운 요소를 Add 할 필요가 없다고 합니다.
즉, 초기화와 추가 필요 없이 기존 요소를 변경해주면 해당 사항이 적용됩니다.
실제로, Graph.AxisY.Clear() 를 주석 처리 후 코드를 실행했는데, 정상적으로 작동했습니다!
1. (AxisY.Clear → AxisY.Add) 대신 AxisY[0]의 기존 요소를 변경해줍니다.
Graph.AxisY[0].Separator.Step = 1;
2. 코드 실행 시, 정상 작동이 확인됩니다.
AxesCollection의 버그가 VisualElement에도 영향이 있다는 것을 알게 되었어요. 아무리 찾아봐도 답이 안 나와서 조금 고생했지만, 그나마 해결 방안을 찾아서 다행입니다.
[결론]
원인
AxisY.Clear()
→ AxesCollection.Clear가 VisualElement.Add에도 영향이 있음.
해결 방법
Y축을 지우거나(Clear) 새로 추가(Add) 할 필요 없이 기존 축에서 변경만 하면 됨.