WPF - 没有焦点的滚动

6
我想在应用程序窗口没有焦点的情况下滚动一个ScrollViewer控件。我在Windows Forms中找到了一些解决方案,但是在WPF中因为一些我需要的东西不可用,所以没找到相关方法。
也许这里有人能帮我解决问题?
提前致谢。
编辑:
我想通过鼠标滚轮来滚动ScrollViewer控件,同时当鼠标悬停在ScrollViewer上时,即使应用程序窗口没有焦点,也可以滚动。

你想要通过编程方式滚动 ScrollViewer,还是希望用户能够在它不是前台窗口时使用鼠标滚动它? - Cody Gray
请查看我的编辑,我认为它会回答你的问题。 - Werewolve
1个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接