none
MsChart: Reihenfolge von ChartAreas ändern oder aktive Area festlegen RRS feed

  • Frage

  • Moin,

    Ich habe in einem Chart mehrere Chartareas hierarchisch geordnet. Nun wollte ich ein Mausklickevent via HitTestResult auswerten und stelle dabei fest, dass die letzte ChartArea in der Liste das MausEvent erhält.

    Ich möchte nicht meine ganze Hierarchie umbauen und suche deshalb nach einer Lösung, wie ich die erste Area in der Liste für die Mausevents aktivieren kann. Zorder habe ich nicht gefunden und BringToFront/SendToBack ist für untergeordnete Objekte ja nicht üblich.

    Danke, Messie


    bin neu hier...
    Dienstag, 9. August 2011 10:54

Antworten

  • Hallo Messie,

    Du läßt dir einfach alle Hits zurückgeben und wählst dann aus dem HitTestResult-Array nur jene aus, die Dich interessieren:

    private void chart1_MouseClick(object sender, MouseEventArgs e)
    {
     if (e.Button == MouseButtons.Left)
     {
      Chart chart = ((Chart)sender);
      HitTestResult[] hits = chart.HitTest(e.X, e.Y, false, new ChartElementType[] { ChartElementType.DataPoint });
      HitTestResult hit = Array.Find(hits, h => h.ChartArea != null && h.ChartArea.Name == "YourFirstChartArea");
     }
    }
    

    Gruß
    Marcel

    • Als Antwort markiert Messie1 Donnerstag, 11. August 2011 17:27
    Donnerstag, 11. August 2011 16:54
    Moderator
  • Hallo Messie,

    Der Aufruf der Methode Chart.HitTest() wird intern an System.Windows.Forms.DataVisualization.Charting.Selection.HitTest() delegiert, wo die ChartAreas nacheinander als Stapel bearbeitet werden. Die Verarbeitung beginnt also mit der zuletzt hinzugefügten ChartArea und kämpft sich bis zur ersten, untersten ChartArea in einer relativ engen Schleife durch. Sobald auf der jeweiligen Ebene ein Treffer gefunden wurde, wird dieser zu einer List<HitTestResult> hinzugefügt, die dann zuguterletzt über ToArray()  das HitTestResult[] aus dem obigen Beispiel zurückgibt.

    Diese Layer-Technik wird z.B. oft im Zusammenhang mit Bildverarbeitungstechniken verwendet.

    Gruß
    Marcel


    • Als Antwort markiert Messie1 Freitag, 12. August 2011 07:28
    Donnerstag, 11. August 2011 18:54
    Moderator

Alle Antworten

  • Hallo Messie,

    Du läßt dir einfach alle Hits zurückgeben und wählst dann aus dem HitTestResult-Array nur jene aus, die Dich interessieren:

    private void chart1_MouseClick(object sender, MouseEventArgs e)
    {
     if (e.Button == MouseButtons.Left)
     {
      Chart chart = ((Chart)sender);
      HitTestResult[] hits = chart.HitTest(e.X, e.Y, false, new ChartElementType[] { ChartElementType.DataPoint });
      HitTestResult hit = Array.Find(hits, h => h.ChartArea != null && h.ChartArea.Name == "YourFirstChartArea");
     }
    }
    

    Gruß
    Marcel

    • Als Antwort markiert Messie1 Donnerstag, 11. August 2011 17:27
    Donnerstag, 11. August 2011 16:54
    Moderator
  • Hallo Marcel,

    danke für den Tipp. Dass sich die Events auf alle Chartareas auswirken, wusste ich nicht. Gibt es das auch bei anderen Komponenten?

     

    Grüße, Messie


    bin neu hier...
    Donnerstag, 11. August 2011 17:29
  • Hallo Messie,

    Der Aufruf der Methode Chart.HitTest() wird intern an System.Windows.Forms.DataVisualization.Charting.Selection.HitTest() delegiert, wo die ChartAreas nacheinander als Stapel bearbeitet werden. Die Verarbeitung beginnt also mit der zuletzt hinzugefügten ChartArea und kämpft sich bis zur ersten, untersten ChartArea in einer relativ engen Schleife durch. Sobald auf der jeweiligen Ebene ein Treffer gefunden wurde, wird dieser zu einer List<HitTestResult> hinzugefügt, die dann zuguterletzt über ToArray()  das HitTestResult[] aus dem obigen Beispiel zurückgibt.

    Diese Layer-Technik wird z.B. oft im Zusammenhang mit Bildverarbeitungstechniken verwendet.

    Gruß
    Marcel


    • Als Antwort markiert Messie1 Freitag, 12. August 2011 07:28
    Donnerstag, 11. August 2011 18:54
    Moderator