Daily-Hour 21: Ereignisse und Interaktionen Teil 5: MouseEventArgs/MouseBottonEventArgs
Der MouseEvent-Handler wird mit zwei Parameter aufgerufen. Der erste ist eine Referenz auf das Objket, welches die Behandlungsroutine aufruft. Der andere Parameter ist entweder vom Typ MouseEventArgs oder MouseButtonEventArgs, abhängig davon welches Event das Ereigniss auslöst.
Der MouseEventArgs-Parameter wird verwendet, wenn die auslösenden Ereignisse MouseEnter, MouseLeave oder MouseMove ist. MouseButtonEventArgs ist Ableitung vom MouseEventArgs, die um die Eigenschaft Handled erweitert wurde, damit der Bubbling-Mechanismus auch gestoppt werden kann.
Sowohl MouseEventArgs als auch MouseButtonEventArgs liefert noch weitere Informationen, welche sehr nützlich sein können.
Die wichtigste dürfte GetPosition sein. Bei Aufruf dieser Methode erfährt man die Koordinaten des Mauszeigers und kann damit arbeiten. Aber ganz so einfach ist es nicht, denn welche Koordinaten werden jetzt genau zurückgeliefert?
Nachdem Silverlight, in einem Browser-PlugIn ausgeführt wird, kann es nun mal nicht auf die Bildschirmkoordinaten zurückgreifen. Deshalb sind es auch die Koordinaten innerhalb des Browser-PlugIn, wenn der GetPosition-Methode als Parameter null übergeben wird.
Man kann aber auch die Position innerhalb eines Objektes über diese Methode ermitteln, in dem man eine Referenz auf das Objekt als Parameter übergibt. Zusätzlich ist es auch möglich jedes x-beliebige Objekt als Referenz heranzuziehen. Der ausschlaggebende Punkt dabei ist immer die linke obere Ecke der BoundingBox eines Objektes. Die Koordinaten werden deshalb negativ, wenn sich die Maus links bzw. oberhalb des Objektes befindet, welches als Referenz für die Koordinatenangabe dient.
Erstellen wir einige Objekt erstellen um das ganze zu betrachten.
xmlns=”http://shemas.microsoft.com/winfx/2006/xaml/presentation”
xmlns:x=”http://shemas.microsoft.com/winfx/2006/xaml”
Width=”640″ Height=”480″ MouseMove=”MouseMoveUserControl”>
Fill=”Red”> Canvas.Left=”50″ Canvas.Top=”75″/>
Fill=”LightBlue” Canvas.Left=”150″ Canvas.Top=”175″/>
FontFamily=”Verdana” FontSize=”15″/>
Innerhalb des UserControls wurde jetzt ein Canvas als Child deklariert. Innerhalb dieses Canvas gibt es 3 weitere Kindobjekte (Ellipse, Rectangle und TextBlock)
Als nächstes benötigt man noch die Methode, die bei Eintritt des MouseMove-Events aufgerufen wird. Da MouseMove ja weitergeleitet wird, können wir diese Event im obersten Element (UserControl) ab arbeiten. In der Methode, welche aus Event-Handler mit den Parameter MouseEventArg aufgerufen wird, verwendet man nun die GetPosition-Methode und gibt dieser verschiedene Objekte als Parameter mit, um die Mauskoordinaten in Relation zu den einzelnen Objekten zu ermitteln.
private void MouseOverUserControl(object sender, MouseEventArgs e)
{
TextDisplay.Text = “MouseMove Koordinaten (UserControl): x= ” +
e.GetPosition(null).X.ToString() + “, y= ” +
e.GetPosition(null).Y.ToString();
TextDisplay.Text += “\nMouseMove Koordinaten (Canvas): x= ” +
e.GetPosition(RootCanvas).X.ToString() + “, y= ” +
e.GetPosition(RootCanvas).Y.ToString();
TextDisplay.Text += “\nMouseMove Koordinaten (Ellipse): x= ” +
e.GetPosition(Circle).X.ToString() + “, y= ” +
e.GetPosition(Circle).Y.ToString();
TextDisplay.Text += “\nMouseMove Koordinaten (Rectangle): x= ” +
e.GetPosition(Square).X.ToString() + “, y= ” +
e.GetPosition(Square).Y.ToString();
}
Die Methode selbst ist relativ einfach, auch wenn diese zunächst verwirrend erscheint. Man erzeugt hier einen Text im ersten Schritt und fügt in den nachfolgenden Schritten weiteren Text hinzu. Wobei es auch möglich gewesen wäre, nicht immer TextDisplay.Text +=… aufzurufen, sondern man hätte wie bei schon z.T. gezeigt, einfach den TextDisplay mit einem einfach “+” anhängen können.
GetPostion() erwartet immer als Parameter das Objekt, welches man für die Koordinatenmessung heranziehen will. Als Rückgabewerte erhält man von dieser Methdoe den Typ Point, also einen X- und Y-Wert.
Wenn man sich den Aufruf von GetPosition() isoliert betrachten will und die Koordinaten zum UserControl ermitteln will:
Point pt = e.GetPosition(null);
double xValue = pt.X;
double yValue = pt.Y;
Hier deklariert man in der ersten Zeile eine Point-Struktur, und übergibt dieser mittels der GetPosition()-Methode die entsprechenden Werte. Da diese eine Pointstruktur haben, kann man davon die X- und Y-Meber abfragen, die wir schließlich in den Double-Werten xValue und yValue speichern.
Wenn jetzt die MouseOverUserControl-Methode betrachtet wird, kann man erkennen, dass in einer Textzeile die X- und Y-Werte ausgelesen werden und mit ein paar andern Textbestandteilen zu einem String zusammengefasst werden. Die beiden Double-Werte werden mittels ToString() noch in einen String umgewandelt.
Wenn man da Projekt jetzt startet, sieht man die verschiedenen Koordinatenwerte, in dem man die Maus über die Objekte bewegt.

Informatik, Internet, Microsoft, Programmiersprachen, RIA, Silverlight









Kommentare