2013-05-14 3 views
0

Я создал систему координат на полотне Элемент. Я рисую для каждой полученной ценности красную точку и соединяю ее со старой.Координата WPF Обновление системы

Смотрите здесь: enter image description here

Я получаю каждую секунду около 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; 
     } 
+0

Опубликуйте свой полный код и XAML. –

ответ

0

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

<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; 

     } 
    } 

Результат:

enter image description here

0

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