我想在拖放操作期间处理诸如 OnMouseMove 或 MouseWheel 之类的事件。
但是,据我从有关 Drag/Drop 的 MSDN 主题中可以看出,在拖放操作期间触发的唯一事件是 GiveFeedback、QueryContinueDrag、Drag Enter/Leave/Over 以及它们的 Preview* 对应事件。从本质上讲,处理这些事件可以让我获得鼠标位置,或者查看用户是否按下了 Ctrl、Shift、Alt、Esc,或者按下或释放了鼠标按钮之一。
不过,我想要的是在拖放操作期间处理其他事件,例如 MouseWheel。具体来说,我想做的是让用户滚动窗口的内容(使用鼠标滚轮),同时在窗口上拖动一些东西。我已经尝试为这些其他事件编写处理程序,包括冒泡和隧道版本,以及将它们附加到控制层次结构的各个级别,但据我所知,它们都没有触发。
我知道有一个部分解决方案(例如,在此处描述),当鼠标位置靠近窗口的顶部或底部时,您可以使用 DragOver 滚动窗口的内容。但这不是我想做的。
我遇到了一篇文章,其中暗示可以在拖动操作期间处理(例如) OnMouseMove 事件。我这么说是因为文章中的代码是上述方法的变体,但它处理的是 OnMouseMove 而不是 DragOver。但是,我尝试采用这种方法,但仍然无法在拖动时触发 OnMouseMove 事件。我在下面添加了我的代码。它在 F# 中,所以我使用了FSharpx的F# XAML 类型提供程序。
MainWindow.xaml:
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="500" Width="900">
<DockPanel Name="panel1">
<StatusBar Name="status1" DockPanel.Dock="Bottom">
<TextBlock Name="statustext1" />
</StatusBar>
</DockPanel>
</Window>
程序.fs:
(*
Added references: PresentationCore, PresentationFramework, System.Xaml, UIAutomationTypes, WindowsBase.
*)
// STAThread, DateTime
open System
// Application
open System.Windows
// TextBox
open System.Windows.Controls
// XAML type provider
open FSharpx
type MainWindow = XAML<"MainWindow.xaml">
type TextBox2 (status : TextBlock) as this =
inherit TextBox () with
member private this.preview_mouse_left_button_down (args : Input.MouseButtonEventArgs) = do
this.CaptureMouse () |> ignore
base.OnPreviewMouseLeftButtonDown args
// Fires while selecting text with the mouse, but not while dragging.
member private this.preview_mouse_move (args : Input.MouseEventArgs) =
if this.IsMouseCaptured then do status.Text <- sprintf "mouse move: %d" <| DateTime.Now.Ticks
do base.OnPreviewMouseMove args
member private this.preview_mouse_left_button_up (args : Input.MouseButtonEventArgs) = do
if this.IsMouseCaptured then do this.ReleaseMouseCapture ()
base.OnPreviewMouseLeftButtonUp args
do
this.PreviewMouseLeftButtonDown.Add this.preview_mouse_left_button_down
this.PreviewMouseMove.Add this.preview_mouse_move
this.PreviewMouseLeftButtonUp.Add this.preview_mouse_left_button_up
let load_window () =
let win = MainWindow ()
let t = new TextBox2 (win.statustext1)
do
t.TextWrapping <- TextWrapping.Wrap
t.AcceptsReturn <- true
t.Height <- Double.NaN
win.panel1.Children.Add t |> ignore
win.Root
[<STAThread>]
(new Application () ).Run(load_window () ) |> ignore