Особенность использования CartesianChart заключается в том, что объект этого типа должен быть обернут в объект типа Panel, в котором не должно быть других графических объектов. При этом панель должна иметь свойство AutoScroll со значением True. Причина этого в том, что по высоте диаграмма будет автоматически растягиваться на всю высоту контейнера, если значение из тэга <Height> будет меньше или равно высоте контейнера. Если заданная высота диаграммы будет больше высоты контейнера, то диаграмма не будет сжиматься, а в панели появится вертикальная полоса прокрутки.
Отсюда следует вторая особенность использования CartesianChart на форме: к размерам и координатам таких объектов нельзя привязывать координаты и размеры других объектов.
График CartesianChart может иметь вид линейной, столбчатой или полосовой диаграммы. За это отвечает атрибут Type тэга <SeriesCollection>. В зависимости от вида отображаемой диаграммы, будет меняться подход к заданию высоты и ширины объекта CartesianChart.
Линейная и столбчатая диаграммы
Если создаем линейный график или столбчатый, то значения тэгов <Height> и <Width> объекта CartesianChart можно привязать к соответствующим get-проперти контейнера:
Аналогичным образом строится объект ExpenseArrayVariable для второй серии данных на диаграмме.
Таким образом, диаграмма будет полностью занимать пространство родительского объекта:
Для таких диаграмм можно не использовать свойство панели AutoScroll со значением True.
Пример отображения столбчатой диаграммы:
Полосовая диаграмма
Если в примере выше в атрибуте Type тэга <SeriesCollection> просто поменять значение на Row без корректировки высоты графика, то при открытии формы некоторые значения на оси Y будут отсутствовать, включая и те, по которым отображаются данные. На скриншоте видно, что Май и Июнь не отображаются:
Это связано с тем, что для отображения диаграммы не хватает высоты. Если увеличим высоту окна, то диаграмма дорисует недостающие значения:
Чтобы по основной оси (оси Y) корректно отображались все данные без изменения размера окна, для расчета высоты объекта CartesianChart нужно учитывать количество элементов в сериях, и это количество умножать на коэффициент, например, 50.
Так как обе серии Income и Expense получают данные из однотипных источников, то достаточно проверять количество элементов в одном из них:
Если бы серии содержали разное количество элементов, то выбирали бы источник с наибольшим количеством.
Таким образом, объект CartesianChart по высоте может выходить за пределы панели, и пользователь не увидит нижнюю часть диаграммы. Поэтому панель должна иметь свойство AutoScroll со значением True, чтобы появлялась вертикальная полоса прокрутки.
Так как полоса прокрутки отображается внутри панели, то при расчете ширины графика стоит учитывать этот момент и вычитать из ширины панели некоторую константу: