C# WPF-无焦点滚动
我想在应用程序窗口未聚焦时滚动ScrollViewer控件。我在Windows窗体中找到了一些解决方案,但在WPF中没有,因为我需要的一些东西不可用 也许这里有人能帮我解决问题 提前谢谢 编辑:C# WPF-无焦点滚动,c#,wpf,winapi,focus,scrollviewer,C#,Wpf,Winapi,Focus,Scrollviewer,我想在应用程序窗口未聚焦时滚动ScrollViewer控件。我在Windows窗体中找到了一些解决方案,但在WPF中没有,因为我需要的一些东西不可用 也许这里有人能帮我解决问题 提前谢谢 编辑: 我想在鼠标悬停在ScrollViewer上时使用鼠标滚轮滚动ScrollViewer控件,但也要在应用程序窗口未聚焦时进行滚动。我找到了一个解决方案。这里有一个例子: XAML <Window x:Class="Project.MainWindow" xmlns="http://schemas.m
我想在鼠标悬停在ScrollViewer上时使用鼠标滚轮滚动ScrollViewer控件,但也要在应用程序窗口未聚焦时进行滚动。我找到了一个解决方案。这里有一个例子: 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>
您想以编程方式滚动
ScrollViewer
,还是希望用户即使不是前台窗口也能用鼠标滚动?请参阅我的编辑,我想它会回答您的问题。
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);
}
}