Bonjour,
J'ai posé cette question sur le forum Windows Form mais je n'ai pas de réponse, alors je tente ma chance sur le forum C# qui, je pense, est plus adapté
J'affiche 2 graphiques, l'un grâce à un Chart, l'autre "manuellement" en dessinant dans un panel.
Or je dois aligner les axes X des deux graphiques.
Il faut donc que je connaisse les coordonnées de l'axe des X du Chart pour dessiner le second graphique.
Les coordonnées du chart ne sont accessibles que dans l'évènement _Paint :
Malheureusement, l'évènement est appelé trop tard et donc les dimensions du graphique sont mesurées trop tard. Comment obtenir ces données à temps, en d'autres termes, comment forcer l'exécution de la fonction avant de dessiner le deuxième graphique ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part chartAreaXAxis.X = (int)neutronsChart.AxisX.ValueToPixelPosition(neutronsChart.AxisX.Minimum);
J'ai fait plusieurs tentatives, toutes infructueuses :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 private void Experiment_Load(object sender, EventArgs e) { reactor = new Reactor(criticalityVariations, precursors); UpdateDataGridViewPrecursors(precursors); chartPopulation.Paint += new PaintEventHandler(this.chartPopulation_Paint); Display(); // je dessine ici mon premier graphique criticalityPanel1.LoadCriticality(criticalityVariations, chartAreaXAxis); //je dessine ici mon deuxième graphique //en espérant avoir récupéré les dimensions du premier graphique ... criticalityPanel1.OnCriticalityChange += criticalityPanel1_OnCriticalityChange; } void chartPopulation_Paint(object sender, PaintEventArgs e) // je mesure ici les dimensions de mon premier graphique //comment forcer l'exécution de cette fonction ? { ChartArea neutronsChart = chartPopulation.ChartAreas[0]; chartAreaXAxis.X = (int)neutronsChart.AxisX.ValueToPixelPosition(neutronsChart.AxisX.Minimum); chartAreaXAxis.Y = (int)neutronsChart.AxisX.ValueToPixelPosition(neutronsChart.AxisX.Maximum); } private void Display() //J'affiche mon premier graphique { foreach (DataPoint dp in reactor.populationAtEveryStep) chartPopulation.Series[0].Points.Add(dp); }
- appeler la fonction en créant un PaintEventArgs
- appeler chartPopulation.Invalidate();
- appeler splitContainer3.panel2.Refresh(); qui contient la chartPopulation
- appeler la méthode refresh de la form : this.refresh();
Merci d'avance
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 private void Experiment_Load(object sender, EventArgs e) { reactor = new Reactor(criticalityVariations, precursors); UpdateDataGridViewPrecursors(precursors); chartPopulation.Paint += new PaintEventHandler(this.chartPopulation_Paint); Display(); //Graphics g = chartPopulation.CreateGraphics(); //Rectangle r = new Rectangle(); //PaintEventArgs ev = new PaintEventArgs(g,r); //chartPopulation_Paint(this,ev); //chartPopulation.Invalidate(); splitContainer3.Panel2.Refresh(); this.Refresh(); criticalityPanel1.LoadCriticality(criticalityVariations, chartAreaXAxis); criticalityPanel1.OnCriticalityChange += criticalityPanel1_OnCriticalityChange; }
Partager