2013-03-14 18 views
5

W mojej aplikacji mam 2 wykresy, jeden nad drugim w interfejsie użytkownika (jak w bliższej górnej części monitora). Obie osie poziome wykresów odnoszą się do tego samego przedziału czasowego. Ich pionowe osie mogą być jednak bardzo różne, więc chcę je zachować w formie wykresów. Oferują one bezpłatne informacje i jako takie, chciałbym, aby ich osie poziome były zsynchronizowane, nawet jeśli ich etykiety osi pionowej będą się przesuwać.Wyrównanie osi pionowych wykresu między 2 obiektami wykresu

W obu przypadkach elementy sterujące wykresu, które je zawierają, mają tę samą szerokość, tylko dane wewnątrz są przesunięte.

Obecnie mam to:

10000| 
8000| 
6000| 
4000| 
2000| 
    0 --------------------------------- 
     0        10 

Long Label 3| 
Long Label 2| 
Long Label 1| 
Long Label 0 ----------------------- 
      0     10 

I chcę to:

 10000| 
     8000| 
     6000| 
     4000| 
     2000| 
      0 --------------------------------- 
      0        10 

Long Label 3| 
Long Label 2| 
Long Label 1| 
Long Label 0 --------------------------------- 
      0        10 

Były pierwotnie oddzielne kontrole Wykres MSChart. Próbowałem umieścić je w tej samej kontroli wykresu co różne obszary wykresów, ale nie rozwiązało problemu.

Jak mogę to osiągnąć? Preferowałbym je na osobnych kontrolkach wykresów, ale mógłbym zadowolić się oddzielnymi obszarami wykresu, jeśli będę musiał.

Odpowiedz

3

W końcu znalazłem odpowiedź. Nadal chciałbym, aby był dostępny w różnych kontrolkach wykresów, jednak jeśli są to różne obszary wykresów w tym samym menu, możesz użyć właściwości ChartArea.AlignWithChartArea.

//Say We have 2 Chart areas, one named "Main Info" and the other "Supplemental" 
chart1.ChartAreas["Supplemental"].AlignWithChartArea = "Main Info"; 
chart1.ChartAreas["Supplemental"].AlignmentOrientation = AreaAlignmentOrientations.Vertical; 
chart1.ChartAreas["Supplemental"].AlignmentStyle = AreaAlignmentStyles.All; 

A to ustawi je tak, jak chciałem.

2

Późna odpowiedź, ale napisz, kto chce otrzymać tę odpowiedź.
Moja odpowiedź to użycie innego wykresu.

double x_position = chart1.ChartAreas[0].AxisX.ScaleView.Position; 
double x_size = chart1.ChartAreas[0].AxisX.ScaleView.Size; 
chart2.ChartAreas[0].AxisX.ScaleView.Zoom(x_position, x_position + x_size);  

W przypadku synchronizacji w czasie rzeczywistym użyj tego kodu w zdarzeniu wykresu AxisViewChanged.

2

przypadku synchronizacja czasu rzeczywistego, jak stwardnienie CharArea Temp powiedział

private void chart1_AxisViewChanged(object sender, ViewEventArgs e) 
{ 
    foreach (var charArea in chart1.ChartAreas) 
    { 
     if (charArea != e.ChartArea) 
     { 
      double x_position = e.ChartArea.AxisX.ScaleView.Position; 
      double x_size = e.ChartArea.AxisX.ScaleView.Size; 
      charArea.AxisX.ScaleView.Zoom(x_position, x_position + x_size);  
     }     
    }    
} 
Powiązane problemy