none
MouseLeftButtonDown im ScrollViewer RRS feed

  • Frage

  • Tach zusammen!

     

    Ich versuche gerade panning für einen Canvas mit hilfe eines ScrollViewers zu impementieren. Dabei gibt es allerdings ein kleines Problem. Aus irgendeinem Grund bekomme ich für den ScrollViewer keine MouseLeftButtonDown events. Ich hab das ganze mal auf das grundlegendste reduziert: 

     

     

    <Window x:Class="ScrollViewTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525">
    <Grid x:Name="LayoutRoot"
         Background="White">
        <ScrollViewer MouseLeftButtonDown="ScrollViewerMouseLeftButtonDown" MouseLeftButtonUp="ScrollViewerMouseLeftButtonUp">      
            <Rectangle Fill="Red"
                  Width="400"
                  Height="200" />
        </ScrollViewer>
      </Grid>
    </Window>
    

     

    Und der CodeBehind dazu (nur zum testen um zu gucken ob die events ankommen):

     

    using System;
    using System.Windows;
    using System.Windows.Input;
    
    namespace ScrollViewTest
    {
      /// <summary>
      /// Interaction logic for MainWindow.xaml
      /// </summary>
      public partial class MainWindow : Window
      {
        public MainWindow()
        {
          InitializeComponent();
        }
    
        private void ScrollViewerMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
          Console.WriteLine("ScrollViewerMouseLeftButtonDown");
        }
    
        private void ScrollViewerMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
          Console.WriteLine("ScrollViewerMouseLeftButtonUp");
        }
      }
    }
    
    

     

    Wenn ich das ganze jetzt laufen lassen und dann ins Fenster klicke, dann kommt das MouseLeftButtonUp event durch, das MouseLeftButtonDown event aber nicht. Irgendetwas verstehe ich da gerade nicht. PreviewMouseLeftButtonDown hab ich auch probiert ... das funktioniert. Notfalls würde ich das auch verwenden. Macht dann aber an anderer Stelle Probleme und ich würde gerne verstehen, was da passiert. Ich steh da gerade auf dem Schlauch. 

    Kann dazu jemand etwas sagen?

    Danke schonmal!

     

    Montag, 29. November 2010 10:08

Antworten

  • Dieser Link sollte dir wohl deine Frage beantworten:
    http://msdn.microsoft.com/en-us/library/system.windows.uielement.mouseleftbuttondown.aspx

    Diese Aussage ist wohl am interessantesten:

    Some control classes might have inherent class handling for mouse button events. The left mouse button down event is the most likely event to have class handling in a control. The class handling often marks the underlying Mouse class event as handled. Once the event is marked handled, other instance handlers that are attached to that element are not ordinarily raised. Any other class or instance handlers that are attached to elements in the bubbling direction towards the root in the UI tree are also not ordinarily raised.

    • Als Antwort markiert wernerdf Montag, 29. November 2010 10:37
    Montag, 29. November 2010 10:23
    Beantworter

Alle Antworten

  • Dieser Link sollte dir wohl deine Frage beantworten:
    http://msdn.microsoft.com/en-us/library/system.windows.uielement.mouseleftbuttondown.aspx

    Diese Aussage ist wohl am interessantesten:

    Some control classes might have inherent class handling for mouse button events. The left mouse button down event is the most likely event to have class handling in a control. The class handling often marks the underlying Mouse class event as handled. Once the event is marked handled, other instance handlers that are attached to that element are not ordinarily raised. Any other class or instance handlers that are attached to elements in the bubbling direction towards the root in the UI tree are also not ordinarily raised.

    • Als Antwort markiert wernerdf Montag, 29. November 2010 10:37
    Montag, 29. November 2010 10:23
    Beantworter
  • Hi Werner,

    ich könnte mir sehr gut vorstellen, dass der SV die Clicks ganz einfach schluckt. Das wiederum könntest Du umfahren, indem Du die korrespondierenden Preview-Events nutzt, also z.B. PreviewMouseLeftButtonDown/PreviewMouseLeftButtonUp.


    Cheers,
    Olaf
    http://blogs.intuidev.com
    Montag, 29. November 2010 10:28
  • Danke für die schnellen Antworten. 

     

    Die der Link von ClassMP2002 war sehr hilfreich. Das hat das "Rätsel" aufgeklärt. Der ScrollViewer schluckt das event tatsächlich. ich stand da nur etwas auf dem Schlauch, weil das LeftMouseButtonUp event ja durchging. Mit einem expliziten AddHandler auf dem ScrollViewer bekomme ich das event dann auch. 

     

    Preview events kann ich an der Stelle leider nicht nutzen. Was ich eigentlich machen will ist etwas komplexer. Die preview events werden in der "falschen Reihenfolge" ausgelöst für das was ich vorhabe. Ich möchte eigentlich, dass das event beim ScrollViewer nur ankommt, wenn es nicht schon durch eines seiner Kinder behandelt wurde. Das preview event wird aber ja im VisualTree zuerst auf dem parent und dann auf den childs ausgeführt. Hilft mir also leider nicht. 

     

    Hab jetzt aber ein Workaround für mein Vorhaben gefunden. Durch den AddHandler Aufruf bekomme ich das event, und durch die event source kann ich bestimmen, ob es auf dem ScrollViewer selbst, oder auf einem seiner Kinder ausgelöst wurde. Nicht schön, sollte aber funktionieren. 

     

    Danke nochmal :)

    Montag, 29. November 2010 10:58