【问题标题】:WPF - Scroll without FocusWPF - 无焦点滚动
【发布时间】:2011-07-05 14:40:32
【问题描述】:

我想在应用程序窗口未聚焦时滚动 ScrollViewer 控件。我在 Windows 窗体中找到了一些解决方案,但在 WPF 中没有找到,因为我需要的一些东西不可用。

也许这里有人可以帮我解决我的问题?

提前致谢。

编辑:

我想在鼠标悬停在 ScrollViewer 上时使用鼠标滚轮滚动 ScrollViewer 控件,但也可以在应用程序窗口未获得焦点时滚动。

【问题讨论】:

  • 您想以编程方式滚动ScrollViewer,还是希望即使它不是前台窗口,用户也能用鼠标滚动它?
  • 看我的编辑,我想它会回答你的问题。

标签: c# wpf winapi focus scrollviewer


【解决方案1】:

我找到了解决方案。举个例子:

XAML

<Window x:Class="Project.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Height="300" Width="500">
    <ScrollViewer x:Name="ScrollViewer">
        <StackPanel>
            <Border Background="Blue" Width="100" Height="100" />
            <Border Background="Red" Width="100" Height="100" />
            <Border Background="Blue" Width="100" Height="100" />
            <Border Background="Red" Width="100" Height="100" />
            <Border Background="Blue" Width="100" Height="100" />
            <Border Background="Red" Width="100" Height="100" />
        </StackPanel>
    </ScrollViewer>
</Window>

代码背后

using System;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Input;
using System.Windows.Interop;

namespace Project
{
    public partial class MainWindow : Window
    {
        private const int WH_MOUSE_LL = 14;
        private const int WM_MOUSEWHEEL = 0x020A;
        private delegate IntPtr LowLevelMouseProc(int nCode, IntPtr wParam, IntPtr lParam);

        private IntPtr _handle;

        public MainWindow()
        {
            InitializeComponent();

            _handle = new WindowInteropHelper(this).Handle;
            SetWindowsHookEx(WH_MOUSE_LL, MouseChanged, _handle, 0);

            ScrollViewer.PreviewMouseWheel += ScrollViewer_MouseWheel;
            Unloaded += MainWindow_Unloaded;
        }

        private void MainWindow_Unloaded(object sender, RoutedEventArgs e)
        {
            UnhookWindowsHookEx(_handle);
        }

        private void ScrollViewer_MouseWheel(object sender, MouseWheelEventArgs e)
        {
            e.Handled = true;
        }

        private IntPtr MouseChanged(int nCode, IntPtr wParam, IntPtr lParam)
        {
            if (ScrollViewer.IsMouseOver && WM_MOUSEWHEEL == (int)wParam)
            {
                MouseData mouseData = (MouseData)Marshal.PtrToStructure(lParam, typeof(MouseData));
                ScrollViewer.ScrollToVerticalOffset(ScrollViewer.VerticalOffset - mouseData.Z / 200000.0);
            }
            return CallNextHookEx(_handle, nCode, wParam, lParam);
        }

        [StructLayout(LayoutKind.Sequential)]
        private struct MouseData
        {
            public int X;
            public int Y;
            public int Z;
        }

        [DllImport("user32.dll")]
        private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelMouseProc lpfn, IntPtr hMod, uint dwThreadId);

        [DllImport("user32.dll")]
        private static extern bool UnhookWindowsHookEx(IntPtr hhk);

        [DllImport("user32.dll")]
        private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-30
    • 2010-11-26
    • 1970-01-01
    • 2014-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多