MS Chart Control: предотвратить увеличение при нажатии - PullRequest
0 голосов
/ 10 мая 2018

Я использую MS Chart Control, который устанавливает курсор при нажатии на диаграмму и позволяет пользователю увеличивать и уменьшать масштаб.Когда пользователь пытается щелкнуть мышью по диаграмме, он случайно перетаскивает прямоугольник с очень маленьким увеличением, и диаграмма увеличивает вместо того, чтобы обрабатывать щелчок.

Что можно сделать, чтобы предотвратить увеличение при попытке щелкнуть мышью?Есть ли что-то вроде минимального размера прямоугольника для масштабирования?

Вот как я справляюсь с кликом:

_area = new ChartArea();

private void chart1_MouseClick(object sender, MouseEventArgs e) 
{
    try 
    {
        _area.CursorX.SetCursorPixelPosition(new Point(e.X, e.Y), true);
    }
    catch (Exception ex) 
    { 

    }
}

И вот как я настраиваю настройки масштабирования и курсора:

_area.AxisX.ScaleView.Zoomable = true;
_area.CursorX.IsUserSelectionEnabled = true;
_area.CursorX.IntervalType = DateTimeIntervalType.Seconds;
_area.CursorX.Interval = 1D;
_area.CursorY.IsUserSelectionEnabled = true;
_area.CursorY.Interval = 0;

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

На основании ответа @ Baddack приведено полное решение.Ключ заключается в том, чтобы отключить функцию масштабирования диаграммы и увеличить вручную (как предложено Baddack) с помощью событий MouseUp/MouseDown.Функция выбора пользователя на диаграмме остается включенной, чтобы использовать прямоугольник выбора для установки интервала масштабирования.

В этом примере кода проверяется, имеет ли размер прямоугольника масштабирования не менее 10 пикселей в ширину и в высоту.Только в этом случае начинается увеличение:

private ChartArea _area;
private Point _chartMouseDownLocation;
...

private void MainForm_Load(object sender, EventArgs e)
{
    ...
    // Disable zooming by chart control because zoom is initiated by MouseUp event
    _area.AxisX.ScaleView.Zoomable = false;
    _area.AxisY.ScaleView.Zoomable = false;

    // Enable user selection to get the interval/rectangle of the selection for 
    // determining the interval for zooming
    _area.CursorX.IsUserSelectionEnabled = true;
    _area.CursorX.IntervalType = DateTimeIntervalType.Seconds;
    _area.CursorX.Interval = 1D;
    _area.CursorY.IsUserSelectionEnabled = true;
    _area.CursorY.Interval = 0;        
}

private void chart1_MouseDown(object sender, MouseEventArgs e)
{
    _chartMouseDownLocation = e.Location;
}

private void chart1_MouseUp(object sender, MouseEventArgs e)
{
    // Check if rectangle has at least 10 pixels with and hright
    if (Math.Abs(e.Location.X - _chartMouseDownLocation.X) > 10 && 
        Math.Abs(e.Location.Y - _chartMouseDownLocation.Y) > 10)
    {
        // Zoom to the Selection rectangle
        _area.AxisX.ScaleView.Zoom(
            Math.Min(_area.CursorX.SelectionStart, _area.CursorX.SelectionEnd),
            Math.Max(_area.CursorX.SelectionStart, _area.CursorX.SelectionEnd)
        );
        _area.AxisY.ScaleView.Zoom(
            Math.Min(_area.CursorY.SelectionStart, _area.CursorY.SelectionEnd),
            Math.Max(_area.CursorY.SelectionStart, _area.CursorY.SelectionEnd)
        );
    }
    // Reset/hide the selection rectangle
    _area.CursorX.SetSelectionPosition(0D, 0D);
    _area.CursorY.SetSelectionPosition(0D, 0D);
}
0 голосов
/ 10 мая 2018

Вы можете вручную изменять масштаб самостоятельно.Вы можете использовать событие MouseDown для захвата начала X и начала Y. Затем используйте событие MouseUp для захвата конца X и конца Y. Получив начальную и конечную точки, вы можете определить, хотите ли вы увеличить илине.Если вы хотите увеличить, вы можете использовать вспомогательную функцию ниже, чтобы увеличить вручную.

private void set_chart_zoom(ChartArea c, double xStart, double xEnd, double yStart, double yEnd)
{
    c.AxisX.ScaleView.Zoom(xStart, xEnd);
    c.AxisY.ScaleView.Zoom(yStart, yEnd);
}
...