下面是一个简单的示例代码,用于生成一个走势曲线图。这个代码可以根据你的需求进行修改和扩展。

首先,我们需要创建一个WPF窗口,并添加一个Canvas控件,用于显示走势曲线图。我们还需要添加一个水平和垂直滚动条,用于滚动显示数据。

MainWindow.xaml:

<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="600" Width="800">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <ScrollBar Name="VerticalScrollBar" Grid.Row="1" Grid.Column="0" Orientation="Vertical" Minimum="0" Maximum="2900000" LargeChange="10000" SmallChange="1000" ValueChanged="VerticalScrollBar_ValueChanged"/>
        <ScrollBar Name="HorizontalScrollBar" Grid.Row="1" Grid.Column="1" Orientation="Horizontal" Minimum="0" Maximum="3600" LargeChange="100" SmallChange="10" ValueChanged="HorizontalScrollBar_ValueChanged"/>
        <Canvas Name="Canvas" Grid.Row="1" Grid.Column="1" Background="White" Width="2900000" Height="3600"/>
    </Grid>
</Window>

在代码中,我们使用了两个滚动条控件,一个垂直滚动条和一个水平滚动条。我们还使用了一个Canvas控件,用于显示走势曲线图。我们将Canvas的宽度设置为2900000,高度设置为3600,以便能够显示所有的数据。

接下来,我们需要在代码中实现滚动条的滑动事件。在滑动事件中,我们将加载新的数据,并更新Canvas上的走势曲线图。

MainWindow.xaml.cs:

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Shapes;

namespace WpfApp1
{
    public partial class MainWindow : Window
    {
        private int lastVerticalValue = 0;
        private int lastHorizontalValue = 0;

        public MainWindow()
        {
            InitializeComponent();

            // 初始化数据
            InitData();

            // 显示初始数据
            ShowData(0, 3600);
        }

        private void InitData()
        {
            // TODO: 初始化数据
        }

        private void ShowData(int start, int end)
        {
            // 清空Canvas
            Canvas.Children.Clear();

            // 绘制走势曲线图
            for (int i = start; i < end; i++)
            {
                // 获取数据
                double x = GetDataX(i);
                double y = GetDataY(i);

                // 绘制点
                Ellipse point = new Ellipse();
                point.Width = 4;
                point.Height = 4;
                point.Fill = Brushes.Blue;
                Canvas.SetLeft(point, x - 2);
                Canvas.SetTop(point, y - 2);
                Canvas.Children.Add(point);

                // 绘制线
                if (i > start)
                {
                    Line line = new Line();
                    line.X1 = GetDataX(i - 1);
                    line.Y1 = GetDataY(i - 1);
                    line.X2 = x;
                    line.Y2 = y;
                    line.Stroke = Brushes.Blue;
                    line.StrokeThickness = 1;
                    Canvas.Children.Add(line);
                }
            }
        }

        private double GetDataX(int index)
        {
            // TODO: 获取X轴数据
            return index;
        }

        private double GetDataY(int index)
        {
            // TODO: 获取Y轴数据
            return 3600 - index % 3600;
        }

        private void VerticalScrollBar_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
        {
            int start = (int)e.NewValue;
            int end = start + 3600;

            if (start < lastVerticalValue)
            {
                // 向前滑动,加载前面的数据
                end = start;
                start = end - 3600;
            }
            else if (start > lastVerticalValue)
            {
                // 向后滑动,加载后面的数据
                start = end - 3600;
            }

            if (start < 0)
            {
                start = 0;
                end = start + 3600;
            }

            if (end > 2900000)
            {
                end = 2900000;
                start = end - 3600;
            }

            ShowData(start, end);

            lastVerticalValue = start;
            lastHorizontalValue = 0;

            HorizontalScrollBar.Value = 0;
        }

        private void HorizontalScrollBar_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
        {
            int start = (int)e.NewValue;
            int end = start + 3600;

            if (start < lastHorizontalValue)
            {
                // 向前滑动,加载前面的数据
                end = start;
                start = end - 3600;
            }
            else if (start > lastHorizontalValue)
            {
                // 向后滑动,加载后面的数据
                start = end - 3600;
            }

            if (start < 0)
            {
                start = 0;
                end = start + 3600;
            }

            if (end > 2900000)
            {
                end = 2900000;
                start = end - 3600;
            }

            ShowData(start, end);

            lastHorizontalValue = start;
            lastVerticalValue = 0;

            VerticalScrollBar.Value = 0;
        }
    }
}

在代码中,我们使用了两个变量lastVerticalValue和lastHorizontalValue,用于记录上一次滚动条的值。在滑动事件中,我们根据当前滚动条的值和上一次滚动条的值来判断是向前滑动还是向后滑动,并加载相应的数据。我们还使用了ShowData方法来绘制走势曲线图。在方法中,我们首先清空Canvas上的所有图形,然后根据当前的数据范围绘制点和线。

需要注意的是,本示例代码中的数据是随机生成的,你需要根据自己的需求来加载实际的数据

WPF 根据Y、X的值生成一个走势曲线图Y、X为一组数据共有290万组数据详细代码 需要水平和垂直滚动条X轴最大显示3600间隔水平滚动条滑动时加载数据如果是往后滑动就加载已显示曲线数据后面的数据往前也是同理

原文地址: https://www.cveoy.top/t/topic/cisf 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录