개발 공부/C# 학습

[C# LiveChart] AxesCollection(AxisX, AxisY), VisualElement를 Add 할 때 NullReferenceException

아밍나 2023. 8. 9. 10:51
728x90

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) 할 필요 없이 기존 축에서 변경만 하면 됨.

 

 

 

 

 

 

 

 

 

 

 


참고 사이트

https://github.com/Live-Charts/Live-Charts/issues/330

728x90
반응형