Обновление системы координат WPF

Я создал систему координат на холсте Элемент. Я рисую для каждого полученного значения красную точку и соединяю ее со старой.

Посмотреть здесь:введите описание изображения здесь

Я получаю каждую секунду около 10 значений.

1 значение = 1 пиксель

Красная линия представляет значения, я получаю постоянное значение только для тестирования.

Моя цель - обновить чертеж, когда он достигнет конца моей системы координат. Я хочу сдвинуть свой рисунок влево и нарисовать следующие точки.

Моя цель:

  • Я не хочу терять точки на моем графике, потому что позже я хочу увеличивать и уменьшать масштаб
  • Я не хочу, чтобы моя система замедлялась как можно меньше...

Это мой код, но я не уверен, как я могу обновить график в конечной части....

        static double xOld = 32;
        static double yOld = 580;
        static double t = 32;
        System.Windows.Shapes.Path path;
        static GeometryGroup lineGroupDrw1 = new GeometryGroup();
        ....


  public void drawPoly(double value)
    {

            //increase point position
            t++;


            //generate 2 point for the connection
            Point pOne = new Point(xOld, yOld);
            Point pTwo = new Point(t, value);

            //connect old point with new
            GeometryGroup lineGroup = new GeometryGroup();
            LineGeometry connectorGeometry = new LineGeometry();
            connectorGeometry.StartPoint = pOne;
            connectorGeometry.EndPoint = pTwo;
            lineGroup.Children.Add(connectorGeometry);
            path = new System.Windows.Shapes.Path();
            path.Data = lineGroup;
            path.StrokeThickness = 1;
            path.Stroke = path.Fill = Brushes.Red;


            //fill the static linegroup with a new point
            lineGroupDrw1.Children.Add(connectorGeometry);

            if (coordinateSystem.Width > t)
            {
                // draw graph
                coordinateSystem.Children.Add(path);
            }
            else 
            {
                //To do : update drawing
                updateDrawingEnd();
            }

            //refresh values
            xOld = t;
            yOld = value;

        }
           ....

          public void updateDrawingEnd() 
        {
            path = new System.Windows.Shapes.Path();
            path.Data = lineGroupDrw1;
            path.StrokeThickness = 1;
            path.Stroke = path.Fill = Brushes.Yellow;

            coordinateSystem.Children.Add(path);
            t = 145;
        }

2 ответа

Просто поместите ваш пользовательский интерфейс внутри прокрутки. Забудьте о попытке "переместить" линии вокруг.

<Window x:Class="MiscSamples.SignalGraph"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="SignalGraph" Height="300" Width="300">
    <ScrollViewer VerticalScrollBarVisibility="Auto"
                  HorizontalScrollBarVisibility="Auto">
        <Grid x:Name="coordinateSystem">

        </Grid>
    </ScrollViewer>
</Window>

Код позади (взят из вашего кода и немного улучшен)

 public partial class SignalGraph : Window
    {
        private System.Threading.Timer timer;
        private Random random = new Random();

        public SignalGraph()
        {
            InitializeComponent();

            timer = new System.Threading.Timer(x => DrawRandomLine(), null, 0, 100);
        }

        private void DrawRandomLine()
        {
            Dispatcher.BeginInvoke((Action) (() => drawPoly(random.Next(0,100))), null);
        }

        static double xOld = 32;
        static double yOld = 580;
        static double t = 32;
        Path path;
        static GeometryGroup lineGroupDrw1 = new GeometryGroup();

        public void drawPoly(double value)
        {
            //increase point position
            t = t+5;


            //generate 2 point for the connection
            var pOne = new Point(xOld, yOld);
            var pTwo = new Point(t, value);

            //connect old point with new
            var lineGroup = new GeometryGroup();

            var connectorGeometry = new LineGeometry {StartPoint = pOne, EndPoint = pTwo};

            lineGroup.Children.Add(connectorGeometry);
            path = new Path
                       {
                           Data = lineGroup, 
                           StrokeThickness = 1,
                           Stroke = Brushes.Red,
                           Fill = Brushes.Red
                       };

            //fill the static linegroup with a new point
            lineGroupDrw1.Children.Add(connectorGeometry);

            //if (coordinateSystem.ActualWidth > t)
            //{
                // draw graph
                coordinateSystem.Children.Add(path);
            //}
            //else 
            //{
            //    //To do : update drawing
            //    updateDrawingEnd();
            //}

            //refresh values
            xOld = t;
            yOld = value;

        }
    }

Результат:

Я хотел бы рассмотреть возможность разработки конкретного пользовательского элемента управления для отображения диаграммы и использования отдельного класса для представления данных диаграммы. Вы можете использовать простой список или создать определенный класс, предоставляющий больше возможностей. Таким образом, вы можете хранить записи всех точек отдельно от проблем пользовательского интерфейса (например, как сохранить в памяти точки, которые больше не отображаются для дальнейшего использования). Вы можете привязать объект диаграммы к своему пользовательскому элементу управления и в этом элементе разработать специальную логику для обработки масштабирования, отображения предыдущих точек и т. Д.

Другие вопросы по тегам