#c_sharp #wpf #график #wpf_canvas
Нарисовал свой график на панели Canvas. Как его рисовал я - Есть массив всех свеч, и я вывожу на панель лишь видимый диапазон свеч, т.е. если сдвинуть график в сторону, я с каждой новой свечой рассчитаю новый диапазон видимых свеч, очищаю Canvas.Children и данный список выведу на график, добавив в Canvas.Children. При таком варианте я могу спокойно настраивать масштаб, при новом расчете я нахожу максимум и минимум свеч и заношу рассчитываю высоту относительно этого. Но данный способ слишком долгий для расчетов. И в итоге логичнее уже на графике хранить сразу все свечи. Но вот проблема заключается тогда в видимом диапазоне. Т.е. надо в массиве Canvas.Childern найти нужные свечи и поменять их значения Y и X, значения длины прямоугольников и линий, которые идут вверх и вниз от них. Но будет ли это лаконичным? На сайтах это всё происходит мгновенно, как ни крути. Может кто подсказать пожалуйста, как лучше реализовать это? 2 картинки, с любого сайта и моей программы.
Ответы
Ответ 1
Смотрите, как можно сделать это с помощью трансформаций. Я буду выводить коллекцию прямоугольников, для вывода буду использовать ItemsControl, у которого в качестве ItemsPanel будет установлен Canvas. ItemsControl я оберну в Border, чтобы просто обозначить границы графика, ну и потом он еще сыграет свою небольшую роль. Также я размещу 2 кнопки для сдвига "окна" просмотра графика:Надеюсь, здесь для вас всё просто и понятно. Теперь я привяжу к ItemsControl коллекцию прямоугольников: public MainWindow() { InitializeComponent(); Graph.ItemsSource = new List { new Rect { X = 10, Y = 10, Height = 10, Width = 10}, new Rect { X = 20, Y = 25, Height = 10, Width = 10}, new Rect { X = 30, Y = 15, Height = 5, Width = 5}, new Rect { X = 100, Y = 40, Height = 15, Width = 5}, new Rect { X = 110, Y = 15, Height = 10, Width = 25}, new Rect { X = 80, Y = 30, Height = 5, Width = 30}, new Rect { X = 65, Y = 40, Height = 10, Width = 10}, new Rect { X = 160, Y = 10, Height = 10, Width = 15}, new Rect { X = 120, Y = 35, Height = 25, Width = 5}, new Rect { X = 140, Y = 45, Height = 5, Width = 5} }; } Хорошо, если запустить проект, то вы уже увидите эти прямоугольники. Теперь я с помощью трансформации масштаба увеличу нашу область просмотра, чтобы прямоугольники уже не помещались на экране, добавьте в разметку ItemsControl: Теперь добавим в TransformGroup еще одну трансформацию - трансформацию сдвига и дадим ей имя, чтобы можно было обращаться из кода: Добавим обработчики кликов по кнопкам: private void ButtonLeftClick(object sender, RoutedEventArgs e) { GraphTransform.X += 10; } private void ButtonRightClick(object sender, RoutedEventArgs e) { GraphTransform.X -= 10; } В разметке: Ну и, наконец, для того, чтобы график не выходил за пределы бордера, установим бордеру обрезку по границам: ClipToBounds="True" Готово! Т.е. ваша задача просто "скормить" свою коллекцию фигур элементам, а остальное всё сделает WPF! Пересчитывать фактические размеры фигур вручную не требуется!
Комментариев нет:
Отправить комментарий