2013-03-25 1 views
1

[편집]시행 착오를 많이 후의 MSChart 차트

에서 x 축 스크롤 막대를 부착, 나는 코드의 나머지 부분은 변경되지 않습니다 동안 스크롤 할 수있는 내 툴팁 코드의 버전을 깨달았다. 두 툴팁 사용법의 유일한 차이는 마우스가있는 정확한 위치가 아니라 pos.x 값이 이동한다는 것입니다. 대신

/*X-axis Tooltip*/ 
tooltip.Show(Math.Truncate(xValue * 1000)/1000 + unit_Converter(), this.chart1, pos.X, pos.Y - 15); 

수단

나는 모든 차이를했다이

/*X-axis Tooltip*/ 
tooltip.Show(Math.Truncate(xValue * 1000)/1000 + unit_Converter(), this.chart1, pos.X - 70, pos.Y - 15); 

했다. 이제 X 축 스크롤 막대를 클릭하고 드래그 할 수 있습니다. 나는 Y 축을 항상 스크롤 할 수있는 이유가 15로 시작되었다고 생각합니다.

마우스 위치와 정확히 일치하는 툴팁 위치를 설정하면 스크롤하려고 할 때 스크롤 막대 대신 도구 설명 자체를 클릭하게됩니다.

"this.chart"대신 "this"를 사용하면 자동으로 툴팁이 약간 옮겨지기 때문에 Josh W가 제공하는 답변도 똑같이 유효합니다. 도와 주셔서 감사합니다!


[원래 질문]

I는 Y 축 및 X 축 스크롤바가있는 차트를 갖는다. 잠시 동안 두 스크롤바가 모두 작동했습니다. 코드가 커지면 X 축 스크롤 막대가 움직이지 않고 Y 축 스크롤 막대가 잘 움직입니다. 나는 당혹 스럽다. 어떤 도움을 주시면 감사하겠습니다. 같은

c# chart control, vertical scrolling problems with zoom ["Stuck Scroll bar"]

그러나 X 축 스크롤로

내가 언급 한 다른 답변은 여전히 ​​붙어 ....

[편집] : 나는 마우스 이동 코드에 내 툴팁는 것을 깨달았다 이 원인. 내 마우스 이동 코드에 대한 호출을 비활성화하면 X 축 스크롤 막대가 다시 작동합니다. 그러나 어떻게하면 둘 다 기능 할 수 있도록 만들 수 있습니까? 정말 ... Y 축를 크로스 에어 툴팁 만 X 축에 스크롤을 해제 할 방법을 알고 있지만하지 않는

void chart1_MouseMove(object sender, MouseEventArgs e) 
    { 
     var pos = e.Location; 
     _point.X = e.Location.X; 
     _point.Y = e.Location.Y; 

     try 
     { 
      if ((chart1.ChartAreas[0].AxisX.PixelPositionToValue(e.X) >= 0) && (chart1.ChartAreas[0].AxisX.PixelPositionToValue(e.X) <= max)) 
      { 
       //Crossair 
       chart1.ChartAreas[0].CursorX.SetCursorPixelPosition(_point, true); 

       //Tooltips      
       double xValue = chart1.ChartAreas[0].AxisX.PixelPositionToValue(e.X); 

       /*X-axis Tooltip*/ 
       tooltip.Show(Math.Truncate(xValue * 1000)/1000 + unit_Converter(), this.chart1, pos.X, pos.Y - 15); 
      } 
     } 
     catch (Exception exception) 
     { 

     } 
} 

시리즈 설정을 설정하려면 코드 :

var series = chart1.ChartAreas[chart1.Series[iname].ChartArea]; 

//Line thickness 
chart1.Series[iname].BorderWidth = 2; 

series.AxisX.Minimum = 0; 
series.AxisX.Maximum = max; 
series.AxisY.Minimum = 0; 
series.AxisY.Maximum = checkedListBox1.CheckedItems.Count * 3 - 2; 
series.AxisX.MajorGrid.Interval = time_of_cycle; 
series.AxisX.MajorGrid.LineDashStyle = ChartDashStyle.DashDotDot; 
series.AxisY.MajorGrid.Interval = 2; 
series.CursorX.Interval = 0; 
series.CursorY.Interval = 0; 

series.AxisX.ScaleView.SmallScrollSize = time_of_cycle /100 ; 
series.AxisY.ScaleView.SmallScrollSize = 1; 

//Disables Y axis lable 
series.AxisY.LabelStyle.Enabled = false; 

series.AxisX.LabelStyle.ForeColor = Color.White; 
series.AxisY.LabelStyle.ForeColor = Color.White; 
series.AxisX.LabelStyle.Format = label_Style_Converter(); 

series.AxisX.LabelStyle.Interval = time_of_cycle * 2; 
series.AxisX.MajorGrid.LineColor = Color.DimGray; 
series.AxisY.MajorGrid.LineColor = Color.DimGray; 
series.AxisX.ScrollBar.BackColor = Color.LightGray; 
series.AxisY.ScrollBar.BackColor = Color.LightGray; 
series.AxisX.ScrollBar.ButtonColor = Color.LightGray; 
series.AxisY.ScrollBar.ButtonColor = Color.LightGray; 
series.AxisX.ScrollBar.ButtonStyle = ScrollBarButtonStyles.SmallScroll; 
series.AxisY.ScrollBar.ButtonStyle = ScrollBarButtonStyles.SmallScroll; 
series.AxisX.ScrollBar.Enabled = true; 
series.AxisY.ScrollBar.Enabled = true; 
series.AxisX.ScrollBar.IsPositionedInside = false; 
series.AxisY.ScrollBar.IsPositionedInside = false; 
series.AxisX.IsMarginVisible = true; 
series.AxisY.IsMarginVisible = false; 
series.AxisX.Name = "µs"; 
series.AxisX.ScaleView.Size = max - time_of_cycle/100; 
series.AxisY.ScaleView.Size = (checkedListBox1.CheckedItems.Count * 3 - 2) + 1 ; 
series.BackColor = Color.Black; 

//crosshair 
var cursor_Y = chart1.ChartAreas["ChartArea1"].CursorY; 
var cursor_X = chart1.ChartAreas["ChartArea1"].CursorX; 
cursor_Y.LineWidth = 1; 
cursor_Y.LineDashStyle = ChartDashStyle.Solid; 
cursor_Y.LineColor = Color.DarkRed; 
cursor_Y.SelectionColor = Color.LightGray; 

cursor_X.LineWidth = 1; 
cursor_X.LineDashStyle = ChartDashStyle.Solid; 
cursor_X.LineColor = Color.DarkRed; 

chart1.MouseMove += new MouseEventHandler(chart1_MouseMove); 
+0

제목을 편집했습니다. "[제목에"태그 "가 포함되어 있어야합니까?] (http://meta.stackexchange.com/questions/19190/)"합의가 "아니오, 그렇지 않아야합니다"로 표시되어야합니다. –

답변

1

을 처음에는 .Show()에 대한 귀하의 전화가 GUI 스레드를 차단하고 있다고 생각했지만 신속하고 더러운 코드에는 그 문제가없는 것으로 보입니다. 한 가지 이상한 점은 툴팁에 주목 한 점은 MouseMove 이벤트에 가입 한 Chart와 툴팁에 '012.png.chart1'이라는 참조가 단지 this 대신에 주어 졌을 때 도구 설명이 아래와 같다면 마우스를 계속 누르면 이벤트가 계속 발생합니다.

즉, 툴팁이 예를 들어 차트에서 벗어난 경우에도 마찬가지입니다.

차트 대신 패널을 사용하여 방금 연주 한 테스트 코드가 있습니다.오류와 아무것도하지 않는 한

private int Counter = 0; 
    private void panel1_MouseMove(object sender, MouseEventArgs e) 
    { 
     Console.WriteLine(string.Format("X{0}, Y{1}\t Count = {2}", e.X, e.Y, Counter)); 
     Counter++; 

     toolTip1.Show(
      string.Format("X{0}, Y{1}\t Count = {2}", e.X, e.Y, Counter), 
      this.panel1, 
      e.X - 75, 
      e.Y -5); 
    } 

Form1

먼저 당신은 또한 시도/catch 문을 제거해야 ... 중 오류를 처리하거나 거품 충돌까지하자 뭔가 (그래서 당신이 그것을 고칠 수 있습니다). 당신이 지금 가지고있는 것은 오류를 던질 수도 있지만, 당신이 그것을 잡아서 무시하기 때문에 결코 알 수 없습니다.

둘째, MouseMove 이벤트가 많이 발생합니다. 툴팁을 표시하기 위해 MouseHover를 사용합니까?

그 외 ... unit_Converter() 호출 또는 심지어 수학 함수 내부에있을 수 있지만 코드가 깨지는 위치는 아닙니다. try/catch가 예외를 숨길 수 있습니다. 선.

+0

도와 주셔서 감사합니다. 때때로 차트가 생성 될 예정인 곳에서 마우스를 배치 할 때 차트가 완전히 준비되지 않았기 때문에 MoveMove 이벤트가 범위를 벗어난 오류를 생성하기 때문에 try catch를 사용하고있었습니다. 나는 그것을 고치는 법을 정말로 알지 못했고, 다른 사람들이 그것을 다루기 위해 노력하고 잡는 것을 보았습니다. 내가 한계를 벗어나는 오류에 대해 수행하고 싶은 일이 없기 때문에 나는 그것들을 비워 둡니다. – hansioux

+0

내 문제에 대한 해결 방법을 알아 냈습니다. 설명이 내 질문에 편집됩니다. – hansioux