locked
mousemove links/rechts abfragen RRS feed

  • Frage

  • hallo, habe jetzt zwei nette videos mit nem würfel. wie kann ich jetzt mause mouse move so abfragen, das wenn ich maus nach links bewege, video links abgespielt wird usw..

    Danke..;D

    Freitag, 16. September 2011 10:49

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 Usergroups
    Freitag, 16. September 2011 18:14
  • was rede ich mousemove, meine eigentlich linksklick und mause nach recht ziehen, und ich habe einen container, mausklick ich ja keine problem aber wie mach ich das mit dem erkennen der richtung ?

    danke

    Freitag, 16. September 2011 21:54
  • im klick eingentlich die jetzt pos. speichern und im move vergleichen ob ich mich +Y oder -Y bewege, aber keine ahnung mit welchen befehlen das geht..

    gute nacht!

    Samstag, 17. September 2011 00:23
  • 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
  • Wow klasse danke, probier das gleich mal aus.. Hoffe mein Silverlightbuch kommt bald ;D
    Samstag, 17. September 2011 12:35
  • 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