2014-01-15 19 views
5

Das Betriebssystem ist Windows 8 auf einem Retina Macbook PRO.WPF - Zwei Finger horizontal scrollen auf Macbook pro Trackpad

Ich muss sowohl vertikales Scrollen mit dem Trackpad als auch horizontales Scrollen in meiner App unterstützen.

Ich möchte die WPF Scrollviewer-Position basierend auf den zwei Fingerbewegungen nach oben/unten (vertikales Scrollen) und links-rechts (horizontales Scrollen) verschieben.

Soweit ich sehe, wird das vertikale Scrollen auf dem Trackpad in ein Mausrad Ereignis im Framework übersetzt. Ich habe jedoch keine Möglichkeit gefunden, zu erkennen, ob ein Mausrad-Ereignis ein horizontaler Bildlauf ist.

Welche Ereignisse sollte ich in WPF behandeln, um dies implementieren zu können?

Antwort

0

Ich habe einen Artikel speziell für Sie geschrieben, um zu wissen, wie man horizontales Scrollen von Touchpad in einer WPF-Anwendung behandelt. Das ist Support Horizontal Scrolling of TouchPad in WPF Application - walterlv


Wir brauchen WM_MOUSEHWHEEL Nachricht aus unserem WPF-Fenster zu holen. Ja! Diese Mausradmeldung. Wir holen vorher vertikale Daten daraus, aber wir holen nun horizontale Daten daraus.

Zuerst sollten wir die Fenstermeldung haken.

protected override void OnSourceInitialized(EventArgs e) 
{ 
    var source = PresentationSource.FromVisual(_board); 
    ((HwndSource) source)?.AddHook(Hook); 
} 

private IntPtr Hook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) 
{ 
    // Handle window message here. 
    return IntPtr.Zero; 
} 

Als nächstes behandeln WM_MOUSEHWHEEL:

const int WM_MOUSEHWHEEL = 0x020E; 

private IntPtr Hook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) 
{ 
    switch (msg) 
    { 
     case WM_MOUSEHWHEEL: 
      int tilt = (short) HIWORD(wParam); 
      OnMouseTilt(tilt); 
      return (IntPtr) 1; 
    } 
    return IntPtr.Zero; 
} 

/// <summary> 
/// Gets high bits values of the pointer. 
/// </summary> 
private static int HIWORD(IntPtr ptr) 
{ 
    var val32 = ptr.ToInt32(); 
    return ((val32 >> 16) & 0xFFFF); 
} 

/// <summary> 
/// Gets low bits values of the pointer. 
/// </summary> 
private static int LOWORD(IntPtr ptr) 
{ 
    var val32 = ptr.ToInt32(); 
    return (val32 & 0xFFFF); 
} 

private void OnMouseTilt(int tilt) 
{ 
    // Write your horizontal handling codes here. 
} 

Sie können in OnMouseTilt Methode horizontales Scrollen Code schreiben.

Besser noch, Sie könnten alle oben genannten Codes in eine häufigere Klasse packen und ein Ereignis MouseTilt auslösen, wie das Hochfahren des Ereignisses MouseWheel.