¿Por qué el zoom/desplazamiento automático no funciona para mi gráfico?

para abreviar, verifiqué en el "WinFormsChartSamples" proporcionada por Microsoft. Lo que quería saber es cómo habilitar el zoom y el desplazamiento para Chartcontrols. El ejemplo que se muestra allí es bastante breve.

using System.Windows.Forms.DataVisualization.Charting;
...

// Set automatic zooming
chart1.ChartAreas["Default"].AxisX.ScaleView.Zoomable = true;
chart1.ChartAreas["Default"].AxisY.ScaleView.Zoomable = true;

// Set automatic scrolling 
chart1.ChartAreas["Default"].CursorX.AutoScroll = true;
chart1.ChartAreas["Default"].CursorY.AutoScroll = true;

...

Intenté esto y no pasó nada, sin zoom ni desplazamiento. Intenté dos cosas:

  1. En Form1.Designer.cs agregué esa información al gráfico.

        chartArea1.Name = "ChartArea1";
        chartArea1.CursorX.AutoScroll = true;
        chartArea1.CursorY.AutoScroll = true;
    
        chartArea1.AxisX.ScaleView.Zoomable = true;
        chartArea1.AxisY.ScaleView.Zoomable = true;
    
        this.chart1.ChartAreas.Add(chartArea1);
        this.chart1.Cursor = System.Windows.Forms.Cursors.Cross;
        legend1.Name = "Legend1";
        this.chart1.Legends.Add(legend1);
        this.chart1.Location = new System.Drawing.Point(297, 62);
        this.chart1.Name = "chart1";
        series1.ChartArea = "ChartArea1";
        series1.Legend = "Legend1";
        series1.Name = "Series1";
        this.chart1.Series.Add(series1);
        this.chart1.Size = new System.Drawing.Size(963, 668);
        this.chart1.TabIndex = 6;
        this.chart1.Text = "chart1";
    
  2. Traté de agregarlo directamente al constructor en Form1.cs.

Quizás sea importante mencionar que estoy usando OpenFileDialog para agregar datos a la serie:

private void openToolStripMenuItem_Click(object sender, EventArgs e)
        {

            Stream fileStream = null;
            OpenFileDialog fDialog = new OpenFileDialog();
            fDialog.Title = "Open File..";
            //First the description of the file separated by "|"
            fDialog.Filter = "((ASC files)| *.asc";
            fDialog.InitialDirectory = @"C:\";

            //Show Messagebox if the file was loaded (Source: MSDN - FileDialog.FilterProperty)
            if (fDialog.ShowDialog() == DialogResult.OK)
            {
                MessageBox.Show("The File was loaded successfully.");

                try
                {
                    if ((fileStream = fDialog.OpenFile()) != null)
                    {
                        using (fileStream)
                        {
                            //Insert code for reading the stream here.
                            Spectrum newSpectrum = new Spectrum(chart1.Series.Count, fDialog.FileName,
                               fDialog.SafeFileName, DataHandler.readSpectrumFromFile(fileStream));

                            addSpectrumToView(newSpectrum);

                        }
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }

            }
        }

Cualquier consejo es bienvenido, gracias de antemano,

BC ++

preguntado el 12 de junio de 12 a las 14:06

4 Respuestas

Creo que en realidad estabas buscando esto:

chart1.ChartAreas["Default"].CursorX.IsUserSelectionEnabled = true;
chart1.ChartAreas["Default"].CursorY.IsUserSelectionEnabled = true;

usado junto con lo que ya tiene debería funcionar bien, que debería verse así:

// Set automatic zooming
chart1.ChartAreas["Default"].AxisX.ScaleView.Zoomable = true;
chart1.ChartAreas["Default"].AxisY.ScaleView.Zoomable = true;

// Set automatic scrolling 
chart1.ChartAreas["Default"].CursorX.AutoScroll = true;
chart1.ChartAreas["Default"].CursorY.AutoScroll = true;

// Allow user selection for Zoom
chart1.ChartAreas["Default"].CursorX.IsUserSelectionEnabled = true;
chart1.ChartAreas["Default"].CursorY.IsUserSelectionEnabled = true;

Respondido 19 ago 16, 17:08

Echa un vistazo aquí: http://archive.msdn.microsoft.com/mschart ¡Hay un ejemplo allí que hace zoom/desplazamiento y mucho, mucho más! :)

Respondido el 13 de junio de 12 a las 12:06

¡El ejemplo que publiqué arriba es de la fuente dada! - チ ー ズ パ ン

El enlace está caído. Es aconsejable no publicar solo enlaces, sino también extractos. - c0dehunter

Para habilitar el zoom fácil, agregue una barra de seguimiento y utilícela para hacer zoom:

    private void trackBar1_Scroll(object sender, EventArgs e)
    {
        chart1.ChartAreas[0].AxisX.ScaleView.Size = trackBar1.Maximum - trackBar1.Value;
        chart1.ChartAreas[1].AxisX.ScaleView.Size = trackBar1.Maximum - trackBar1.Value;
        (etc for however many chart areas you have)
    }

el "valor máximo" es para que cuanto mayor sea el valor de la barra de seguimiento, se muestren menos puntos (zoom más cercano)

y asegúrese de que en el diseñador 'chart1->ChartAreas->Axes->(cualesquiera que sean los ejes)->scaleview->zoomable' esté configurado en verdadero

Una barra de desplazamiento normalmente aparecerá cuando un punto de datos exceda el tamaño de la vista de escala de un eje, si se ha configurado (el desplazamiento no funciona de manera confiable si se deja en 'auto'), si no lo ha hecho, configúrelo, si una barra de desplazamiento no aparece, se puede volver a utilizar una barra de seguimiento:

    private void trackBar2_ValueChanged(object sender, EventArgs e)
    {
        chart1.ChartAreas[0].AxisX.ScaleView.Position = trackBar2.Value;
        chart1.ChartAreas[1].AxisX.ScaleView.Position = trackBar2.Value;
        (etc for however many chart areas you have)
    }

Asegúrese de establecer el "Máximo" en las barras de seguimiento en un buen número alto (por ejemplo, 5000) y el "Valor" en el que desea que se cargue.

Todavía no he notado demasiada diferencia entre "trackBar_Scroll" y "trackBar_ValueChanged", excepto que "ValueChanged" funciona si la barra de seguimiento se mueve con el programa o el clic del mouse del usuario, mientras que "Scoll" solo funciona si se mueve con el clic del mouse del usuario.

¿Algo que me haya perdido?

Respondido el 13 de junio de 12 a las 16:06

A mis usuarios no les gusta el comportamiento estándar del zoom y desplazamiento de mschart. Por eso implemento un zoom/desplazamiento basado en el mouse que usa arrastrar y rueda del mouse sobre ejes.

El código fuente está aquí: https://bitbucket.org/controlbreak/mschartfriend

Es muy simple y corto, puedes cambiarlo muy rápidamente si lo necesitas.

Respondido 18 Oct 12, 08:10

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.