2013-03-25 31 views
1

[編輯]卡住x軸滾動條中的MSChart圖表

大量的試驗和錯誤之後,我意識到一個版本的我提示的代碼可以滾動,而代碼的其他部分保持不變。兩個工具提示用法之間的唯一區別是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開始。

因此,如果您將工具提示位置設置在鼠標位置所在的位置,那麼顯然您將在嘗試滾動時單擊工具提示本身而不是滾動條。

Josh W提供的答案同樣有效,因爲使用「this」而不是「this.chart」自動將工具提示由於某種原因稍微移動一點。謝謝您的幫助!


[原文問題]

我有一個具有Y軸和X軸的滾動條的圖表。一段時間,我的滾動條工作。隨着代碼的增長,X軸滾動條現在不會移動,而Y軸滾動條移動得很好。我感到困惑。任何幫助,將不勝感激。

我已經提到其他的答案,如

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

但X軸滾動條仍然停留....

[編輯]: 我意識到,我的鼠標移動代碼的工具提示造成這一點。如果我禁用我對我的鼠標移動代碼的調用,則X軸滾動條將再次起作用。但是,我如何做到這一點,以便兩者都可以發揮作用?我真的不知道crossair提示如何禁用滾動僅在X軸,而不是Y軸...

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/)」,這裏的共識是「不,他們不應該」。 – 2013-03-26 02:44:06

回答

1

起初我想也許你打給.Show()的電話阻塞了GUI線程,但是一些快速而髒的代碼似乎沒有這個問題。然而,我注意到工具提示的一件奇怪事情是,當你有像你的Chart訂閱MouseMove事件的東西,並且你的工具提示被賦予了一個'this.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

首先,你也應該擺脫try/catch語句的,你是不是做與錯誤什麼...無論是處理錯誤,或讓他們泡了崩潰一些東西(這樣你就可以「修復」它)。你現在擁有的東西可能會拋出一個錯誤,但你永遠不會知道,因爲你正在捕捉它並忽略它。

其次,MouseMove事件發生很多...也許使用MouseHover顯示工具提示?

除此之外......它似乎不是你的代碼破壞的地方,儘管它可能在unit_Converter()調用中,甚至在數學函數中......你的try/catch可能隱藏了一個異常線。

+0

感謝您的幫助,我使用了try catch,因爲偶爾當我的鼠標放置在即將生成圖表的位置時,MoveMove事件會因爲圖表沒有完全準備好而生成越界錯誤。我真的不知道如何解決這個問題,並且看到其他人使用try和catch來處理它。由於我對這些出界錯誤沒有任何要做的事,所以我將它們留空。 – hansioux 2013-03-28 09:50:29

+0

我已經想出了一個解決我的問題的解決方案,解釋將被編輯到我的問題。 – hansioux 2013-03-28 09:51:11