2016-06-16 9 views
0

MSChart를 클릭하고 왼쪽/오른쪽으로 드래그하여 차트를 오른쪽/왼쪽으로 스크롤 할 수있는 방법이 있습니까? 아이디어는 차트의 스크롤 막대를 드래그하는 대신 차트를 드래그하는 것입니다. 단순히 스크롤 막대를 사용하지 않는 이유는이 기능 (보스 및 요구 사항)을 추가해야했기 때문입니다. Btw, C# 및 winforms 사용하고 있습니다. 희망이 충분히 분명했습니다. 감사합니다.차트를 스크롤하려면 MSChart 차트를 드래그

답변

1

예 가능합니다.

차트 위로 드래그하여 정상적인 확대/축소 메커니즘을 사용할 수 없다는 것이 하나의 문제입니다.

대신 두 개의 mouseevents를 코딩하고 Axis.PixelPositionToValue 함수를 사용하여 데이터 값에 액세스하십시오. 우리가 Axis.Minimum 이동과 적응 얼마나 멀리 이전 범위를 계산 다음

double mDown = double.NaN; 

private void chart1_MouseDown(object sender, MouseEventArgs e) 
{ 
    Axis ax = chart1.ChartAreas[0].AxisX; 
    mDown = ax.PixelPositionToValue(e.Location.X); 
} 

MinimumMaximum :

먼저 우리는 클릭 한 위치의 데이터 값을 저장

private void chart1_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (!e.Button.HasFlag(MouseButtons.Left)) return; 
    Axis ax = chart1.ChartAreas[0].AxisX; 
    double range = ax.Maximum - ax.Minimum; 
    double xv = ax.PixelPositionToValue(e.Location.X); 
    ax.Minimum -= xv - mDown; 
    ax.Maximum = ax.Minimum + range; 
} 

당신이 원하는 것 너무 많이 왼쪽이나 오른쪽으로 드래그하지 않도록 몇 가지 검사를 추가하십시오.

코드에서 y ou는 MinimumMaximum을 설정했습니다!

또한 x 축 레이블의 형식을 제어하여 소수 자릿수가 많아서 차트가 돌아 가지 않도록해야합니다.

또는 데이터에 따라, 당신은 단순히 ints로 간격 또는 내 경우에는 적절한 어떤 값의 배수의 단계를 설정할 수 있습니다 : 당신은이해야하는 경우

ax.Minimum -= (int)(xv - mDown) ; 

을 표시되는 스크롤바는 여전히 위의 코드를 사용할 수 있습니다. 하지만 당신은이에 의해이

ax.Minimum -= (int)(xv - mDown); 
ax.Maximum = ax.Minimum + range; 

을 대체해야합니다

double oldPos = ax.ScaleView.Position; 
ax.ScaleView.Position -= (xv - mDown); 

그러나이 은 일반 scolling와 INTERFER 않습니다. 당신은 당신이 이런 식으로 스크롤을 타격하지 있는지 확인하기 위해 검사를 삽입 할 수 있습니다

RectangleF ipar = InnerPlotPositionClientRectangle(chart1, chart1.ChartAreas[0]); 
if (ipar.Contains(e.Location)) 
{ 
    .. 
    .. 

을 여전히 여기에 역할을합니다 ..하지만. 따라서 또는이 가장 잘 작동하는 것 같습니다.

InnerPlotPositionClientRectanglehere으로 정의됩니다.