Laden...

WPF: Raster mit MausEvent erzeugen? Idee & Hilfe.

Erstellt von Disaster2k vor 12 Jahren Letzter Beitrag vor 12 Jahren 2.719 Views
D
Disaster2k Themenstarter:in
23 Beiträge seit 2011
vor 12 Jahren
WPF: Raster mit MausEvent erzeugen? Idee & Hilfe.

Hi...

Ich will folgendes mir WPF realisieren, allerdings fehlt mir etwas der Plan:

Ich will ein Raster erstellen mit quadratischen Feldern (z.B.: 40 x 40). Wenn mit der Maus darüber fährt soll sich das darunterliegende Feld verfärben.

Klingt nicht schwer. Ich hab das Probiert mit lauter rectangles. Allerdings können das sehr viele Quadrate werden und dann läuft das nicht mehr flüssig.

Jetzt hab ich überlegt einfach nur den Hintergrund mit den Quadraten anzumalen -> GeometryBrush... Aber wie bekommt man dann das mit dem verfärben hin?

Hat da vielleicht jemand eine Idee für mich?

Danke

5.658 Beiträge seit 2006
vor 12 Jahren

Hi Disaster2k,

Jetzt hab ich überlegt einfach nur den Hintergrund mit den Quadraten anzumalen -> GeometryBrush... Aber wie bekommt man dann das mit dem verfärben hin?

Indem du der Geometrie die entsprechenden Farbe zuweist. Oder hab ich was falsch verstanden?

Christian

Weeks of programming can save you hours of planning

G
47 Beiträge seit 2011
vor 12 Jahren

Hi Disaster2k,

Ich hab das Probiert mit lauter rectangles. Allerdings können das sehr viele Quadrate werden und dann läuft das nicht mehr flüssig.

Ich sehe da das Problem nicht, wenn du bei Rectangles die Ereignisse MouseEnter und MouseLeave abfängst und jeweils die Füllung änderst.


        Color lastcol;
        private void Rectangle_MouseEnter(object sender, MouseEventArgs e)
        {
            Rectangle rect = sender as Rectangle;
            SolidColorBrush brush=rect.Fill as SolidColorBrush;
            lastcol = brush.Color;
            brush.Color=Color.Multiply(lastcol,2f);
        }

        private void Rectangle_MouseLeave(object sender, MouseEventArgs e)
        {
            Rectangle rect = sender as Rectangle;
            rect.Fill = new SolidColorBrush(lastcol);
        }

Du musst ja nicht alle Felder neuzeichnen, sondern nur die Felder, die du mit der Maus überfährst.

Gruß Gwinn

D
Disaster2k Themenstarter:in
23 Beiträge seit 2011
vor 12 Jahren

Hallo und schon mal Danke...

@MrSparke

Ich will lauter weiße Quadrate zeichnen mit schwarzen Rand. Das ist kein Problem mit dem Brush. Aber ich will wenn ich über ein Quadrate mit der Maus fahre das es sich Grün einfärbt.

@Gwinn

Das ich die Quadrate nicht alle neu zeichnen muss ist mir klar, aber wenn ich ein Feld mit 100 x 50 Rectangel-Controlls erzeuge ladet das schon recht lange. Drum dachte ich an 1x zeichnen und dann nur einfärben.

297 Beiträge seit 2008
vor 12 Jahren

Ich würde den Hintergrund, wie bereits von dir beschrieben, mit einem GeometryBrush zeichnen und dann ein einzelnes Quadrat (abhängig von der Mausposition) in grün darüberzeichnen.

There are 10 kind of people, those who understand binary and those who don't.

5.658 Beiträge seit 2006
vor 12 Jahren

Ich will lauter weiße Quadrate zeichnen mit schwarzen Rand. Das ist kein Problem mit dem Brush. Aber ich will wenn ich über ein Quadrate mit der Maus fahre das es sich Grün einfärbt.

Dann würde ich ganz anders vorgehen: Zeichne doch die "Umrandung" als durchgängige Linien. Bei 100x100 Quadraten werden so immerhin nur 198 Linien gezeichnet statt 40.000 wenn du die Umrandungen jedes Quadrates zeichest.

So mußt du dann auch nur ein Quadrat zeichnen (statt insgesamt 10.000), das eine Farbe zugewiesen bekommt. Je nachdem, wo sich die Maus befindet, verschiebst du dieses Quadrat einfach dorthin.

Würde das funktionieren?

Christian

Weeks of programming can save you hours of planning

D
Disaster2k Themenstarter:in
23 Beiträge seit 2011
vor 12 Jahren

@MrSparkle:

Dein Ansatz mit den Linien gefällt mir sehr gut. Werde ich gleich mal testen.

Aber wie ich es umsetzten soll das ein Quadrat eingefärbt wird, weiß ich noch nicht so recht. Da muss ich ja praktisch die Mausposition auswerten und dann die Position berechnen an die das farbige Quadrat gezeichnet werden soll. Was das ganze umso schwieriger macht wenn ich hierfür noch ein Panel mit Zoom-Funktion verwende da wie gesagt die Anzahl der Quadrate sehr groß werden kann.

5.658 Beiträge seit 2006
vor 12 Jahren

Hi Disaster2k,

die Position des eingefärbten Quadrates zu berechnen ist zugegebenermaßen etwas tricky, wenn man Zoom und Pan verwendet, aber an sich kein großes Problem!

Implementier es doch erstmal ohne Zoom und Pan, und wenn es funktioniert brauchst du nur eine Multiplikation und eine Addition in der richtigen Reihenfolge anzuwenden.

Einfärben kannst du das Quadrat einfach mit einem SolidColorBrush.

Christian

Weeks of programming can save you hours of planning

D
Disaster2k Themenstarter:in
23 Beiträge seit 2011
vor 12 Jahren

Alles klar, so werde ich es versuchen. Werde euch demnächst mitteilen wie es mir ergangen ist 😃. Vielleicht hab ich ja dann noch weitere Fragen.

Soweit mal vielen Dank.