Benutzer mit den meisten Antworten
mousemove links/rechts abfragen

Frage
Antworten
-
Hallo Bergfeuer,
ich habe mal eine kleine Beispielanwendung gebaut, die dir grundsätzliche Vorgehensweise veranschaulicht.
Die UI besteht aus zwei Rectangle-Elementen, eins blau, eins rot. Außerdem gibt es einen TextBlock, in dem angezeigt wird, was wo gerade passiert.
Im Code behind wird beim Click (MouseLeftButtonDown) in einem Rectangle ein EventHandler für das MouseMove-Ereignis hinzugefügt, der checkt, in welche Richtung sich der Mauszeiger bewegt. Wird die Maustaste losgelassen, wird der EventHandler für das MausMove-Ereignis wieder entfernt, ebenso, wenn der Mauszeiger das betreffende Rectangle verläßt.
Wichtig sind die beiden privaten Variablen _InitialPosition und _UTurnPosition. _InitialPosition speichert die aktuelle Mauszeigerposition im betreffenden Rectangle im Moment des MausClicks auf; _UTurnPosition dient der Überprüfung, ob während gedrückter Maustaste eine Richtungsänderung erfolgt. Letzteres ist erforderlich, weil _InitialPosition darüber keine Auskunft gibt.
MainPage.xaml:
<UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Class="LeftClickRecognizeMouseMoveDirection.MainPage" Width="640" Height="480" FontFamily="Verdana" FontSize="14.667"> <Grid x:Name="LayoutRoot" Background="White"> <Grid Height="214" VerticalAlignment="Top"> <Grid.ColumnDefinitions> <ColumnDefinition /> <ColumnDefinition /> </Grid.ColumnDefinitions> <Rectangle x:Name="rBlue" Fill="#FF3B3BBC" Stroke="Black" Tag="blue" /> <Rectangle x:Name="rRed" Fill="#FFBA4E2E" Stroke="Black" Grid.Column="1" Tag="red" /> </Grid> <TextBlock x:Name="tbInfo" HorizontalAlignment="Center" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Center" /> </Grid> </UserControl>
MainPage.xaml.vb:
Partial Public Class MainPage Inherits UserControl Public Sub New() InitializeComponent() AddHandler rBlue.MouseLeftButtonDown, AddressOf RectMouseDown AddHandler rRed.MouseLeftButtonDown, AddressOf RectMouseDown AddHandler rBlue.MouseLeftButtonUp, AddressOf RectMouseUp AddHandler rRed.MouseLeftButtonUp, AddressOf RectMouseUp AddHandler rBlue.MouseLeave, AddressOf RectLeaving AddHandler rRed.MouseLeave, AddressOf RectLeaving End Sub Private _InitialPosition As Point Private _UTurnPosition As Point Private Sub RectMouseDown(ByVal sender As Object, ByVal e As MouseButtonEventArgs) AddHandler CType(sender, Rectangle).MouseMove, AddressOf RectMouseMove Me._InitialPosition.X = e.GetPosition(CType(sender, Rectangle)).X End Sub Private Sub RectMouseMove(ByVal sender As Object, ByVal e As MouseEventArgs) If Me._UTurnPosition.X <> Me._InitialPosition.X Then Me._InitialPosition.X = Me._UTurnPosition.X End If Dim tmp = e.GetPosition(CType(sender, Rectangle)).X If e.GetPosition(CType(sender, Rectangle)).X < Me._InitialPosition.X Then tbInfo.Text = String.Format("Mouse moving left in {0} rectangle", CType(sender, Rectangle).Tag.ToString) ElseIf e.GetPosition(CType(sender, Rectangle)).X > Me._InitialPosition.X Then tbInfo.Text = String.Format("Mouse moving right in {0} rectangle", CType(sender, Rectangle).Tag.ToString) End If Me._UTurnPosition.X = e.GetPosition(CType(sender, Rectangle)).X End Sub Private Sub RectLeaving(ByVal sender As Object, ByVal e As MouseEventArgs) RemoveHandler CType(sender, Rectangle).MouseMove, AddressOf RectMouseMove tbInfo.Text = "Waiting for new MouseLeftButtonDown event." End Sub Private Sub RectMouseUp(ByVal sender As Object, ByVal e As MouseButtonEventArgs) RemoveHandler CType(sender, Rectangle).MouseMove, AddressOf RectMouseMove tbInfo.Text = "Waiting for new MouseLeftButtonDown event." End Sub End Class
Ich hoffe das hilft.
Beste Grüße,
Martin
- Als Antwort markiert Bergfeuer Montag, 19. September 2011 15:35
Samstag, 17. September 2011 11:03
Alle Antworten
-
Wenn du zwei getrennte Container für die Videos hast, kannst du auf jedem dieser Container das MouseMove nutzen um das eigene Video zu starten und das andere anzuhalten.
Wenn nicht würde ich mir die letzten 3 Mauspositionen speichern (beim Move) und daraus die Richtung und das Video ermitteln.
Daniel
http://www.silverlight-community.de - deutsche Community mit Tutorials, Blogs und UsergroupsFreitag, 16. September 2011 18:14 -
Hallo Bergfeuer,
ich habe mal eine kleine Beispielanwendung gebaut, die dir grundsätzliche Vorgehensweise veranschaulicht.
Die UI besteht aus zwei Rectangle-Elementen, eins blau, eins rot. Außerdem gibt es einen TextBlock, in dem angezeigt wird, was wo gerade passiert.
Im Code behind wird beim Click (MouseLeftButtonDown) in einem Rectangle ein EventHandler für das MouseMove-Ereignis hinzugefügt, der checkt, in welche Richtung sich der Mauszeiger bewegt. Wird die Maustaste losgelassen, wird der EventHandler für das MausMove-Ereignis wieder entfernt, ebenso, wenn der Mauszeiger das betreffende Rectangle verläßt.
Wichtig sind die beiden privaten Variablen _InitialPosition und _UTurnPosition. _InitialPosition speichert die aktuelle Mauszeigerposition im betreffenden Rectangle im Moment des MausClicks auf; _UTurnPosition dient der Überprüfung, ob während gedrückter Maustaste eine Richtungsänderung erfolgt. Letzteres ist erforderlich, weil _InitialPosition darüber keine Auskunft gibt.
MainPage.xaml:
<UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Class="LeftClickRecognizeMouseMoveDirection.MainPage" Width="640" Height="480" FontFamily="Verdana" FontSize="14.667"> <Grid x:Name="LayoutRoot" Background="White"> <Grid Height="214" VerticalAlignment="Top"> <Grid.ColumnDefinitions> <ColumnDefinition /> <ColumnDefinition /> </Grid.ColumnDefinitions> <Rectangle x:Name="rBlue" Fill="#FF3B3BBC" Stroke="Black" Tag="blue" /> <Rectangle x:Name="rRed" Fill="#FFBA4E2E" Stroke="Black" Grid.Column="1" Tag="red" /> </Grid> <TextBlock x:Name="tbInfo" HorizontalAlignment="Center" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Center" /> </Grid> </UserControl>
MainPage.xaml.vb:
Partial Public Class MainPage Inherits UserControl Public Sub New() InitializeComponent() AddHandler rBlue.MouseLeftButtonDown, AddressOf RectMouseDown AddHandler rRed.MouseLeftButtonDown, AddressOf RectMouseDown AddHandler rBlue.MouseLeftButtonUp, AddressOf RectMouseUp AddHandler rRed.MouseLeftButtonUp, AddressOf RectMouseUp AddHandler rBlue.MouseLeave, AddressOf RectLeaving AddHandler rRed.MouseLeave, AddressOf RectLeaving End Sub Private _InitialPosition As Point Private _UTurnPosition As Point Private Sub RectMouseDown(ByVal sender As Object, ByVal e As MouseButtonEventArgs) AddHandler CType(sender, Rectangle).MouseMove, AddressOf RectMouseMove Me._InitialPosition.X = e.GetPosition(CType(sender, Rectangle)).X End Sub Private Sub RectMouseMove(ByVal sender As Object, ByVal e As MouseEventArgs) If Me._UTurnPosition.X <> Me._InitialPosition.X Then Me._InitialPosition.X = Me._UTurnPosition.X End If Dim tmp = e.GetPosition(CType(sender, Rectangle)).X If e.GetPosition(CType(sender, Rectangle)).X < Me._InitialPosition.X Then tbInfo.Text = String.Format("Mouse moving left in {0} rectangle", CType(sender, Rectangle).Tag.ToString) ElseIf e.GetPosition(CType(sender, Rectangle)).X > Me._InitialPosition.X Then tbInfo.Text = String.Format("Mouse moving right in {0} rectangle", CType(sender, Rectangle).Tag.ToString) End If Me._UTurnPosition.X = e.GetPosition(CType(sender, Rectangle)).X End Sub Private Sub RectLeaving(ByVal sender As Object, ByVal e As MouseEventArgs) RemoveHandler CType(sender, Rectangle).MouseMove, AddressOf RectMouseMove tbInfo.Text = "Waiting for new MouseLeftButtonDown event." End Sub Private Sub RectMouseUp(ByVal sender As Object, ByVal e As MouseButtonEventArgs) RemoveHandler CType(sender, Rectangle).MouseMove, AddressOf RectMouseMove tbInfo.Text = "Waiting for new MouseLeftButtonDown event." End Sub End Class
Ich hoffe das hilft.
Beste Grüße,
Martin
- Als Antwort markiert Bergfeuer Montag, 19. September 2011 15:35
Samstag, 17. September 2011 11:03 -
Danke klappt, das hätte ich im leben nicht geschaft..
nur noch eins, präsentiere das alles ja in einem mediapayer, also links wie rechts rum. was mir nicht gefählt, das er dann immer neu läd wenn er das ander video aufruft, gibts da irgend ein trick, das zu verhindern..
Samstag, 17. September 2011 17:03 -
Ich habe eine Verständnisfrage:
Wie genau soll die UI-Bedienung aussehen?
Verstehe ich das richtig: Du hast zwei nebeneinanderliegende MediaElemente. Linksklick auf z.B. das linke MediaElement soll es starten, sobald die Maus bei gedrückter Maustaste nach Rechts bewegt wird und stoppen sobald die Maus bei gedrückter Maustaste nach Links bewegt wird?
Kann ich mir nicht vorstellen, dass das so sein soll. Denn, worin läge der Benefit? Ein einfacher Mausklick zum Starten/Stoppen würde es doch auch machen, oder sehe ich das irgendwie falsch?
Beschreib mal genau, wie die Steuerung der Videos durch den Nutzer aussehen soll.
Sonntag, 18. September 2011 09:43