c# - WPF - 在 Macbook pro 触控板上的两指水平滚动

标签 c# wpf scroll trackpad

操作系统是 Retina Macbook PRO 上的 Windows 8。

我需要在我的应用中支持使用触控板的垂直滚动和水平滚动。

我想根据两根手指的上下滑动(垂直滚动)和左右滑动(水平滚动)来移动 WPF 滚动查看器的位置。

据我所知,触控板上的垂直滚动被转换为框架中的鼠标滚轮事件。但是,我发现无法识别鼠标滚轮事件是否为水平滚动。

我应该在 WPF 中处理哪些事件才能实现它?

最佳答案

我专门写了一篇文章,让您了解如何在 WPF 应用程序中处理触摸板的水平滚动。即Support Horizontal Scrolling of TouchPad in WPF Application - walterlv


我们需要从 WPF 窗口中获取 WM_MOUSEHWHEEL 消息。是的!鼠标滚轮消息。我们之前从中获取垂直数据,但现在从中获取水平数据。

首先,我们应该钩住窗口消息。

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;
}

接下来,处理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.
}

您可以在OnMouseTilt 方法中编写水平滚动代码。

更好的是,您可以将上述所有代码打包到一个更通用的类中,并引发一个 MouseTilt 事件,就像引发 MouseWheel 事件一样。

关于c# - WPF - 在 Macbook pro 触控板上的两指水平滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21146183/

相关文章:

c# - 在 XAML 中为用户控件设置属性

wpf - 在 WPF 应用程序中使用 IoC 解决依赖关系的位置在哪里?

c# - 具有静态和可编辑文本的 WPF 文本框?

c# - 使用 nunit 测试属性是否抛出异常

c# - BackgroundWorker.CancellationPending 线程安全如何?

javascript - 单击 <a href ="#divID"> 后防止浏览器垂直滚动

javascript - jQuery 滚动条插件

java - 下载整个网页

c# - 如何将枚举与附加字符串值进行比较

c# - WPF 在处理事件之前等待动画结束