如何捕捉结束调整窗口?我需要在WPF中捕获事件endresize。WPF不提供仅在调整大小过程结束时触发的事件。SizeChanged是唯一与窗口大小调整相关的事件-它会在调整大小过程中触发多次。完整的hack是在SizeChanged事件触发时不断设置计时器。那么定时器就不能滴答了,直到调整结束,到时候才会做一个过程。publicMyUserControl(){_resizeTimer.Tick+=_resizeTimer_Tick;}DispatcherTimer_resizeTimer=newDispatcherTimer{Interval=newTimeSpan(0,0,0,0,1500),IsEnabled=false};privatevoidUserControl_SizeChanged(objectsender,SizeChangedE){_resizeTimer.IsEnabled=true;_resizeTimer.Stop();_resizeTimer.Start();}void_resizeTimer_Tick(objectsender,EventArgse){_resizeTimer.IsEnabled=false;//Doendofresizeprocessing}.NET的ReactiveExtensions正在处理标准事件模式,提供了一些非常酷的功能,包括限制事件的能力。我在处理大小更改事件时遇到了类似的问题,虽然解决方案仍然有点“hacky”,但我认为ReactiveExtensions提供了一种更优雅的方法。这是我的实现:IObservableObservableSizeChanges=Observable.FromEventPattern(this,"SizeChanged").Select(x=>x.EventArgs).Throttle(TimeSpan.FromMilliseconds(200));IDisposableSizeChangedSubscription=ObrrvableSizeChanges.ObserveOn().Subscribe(x=>{Size_Changed(x);});这将有效地限制SizeChanged事件,以便您的Size_Changed方法(您可以在其中执行自定义代码)在200毫秒(或任何您想要的长时间等待)过去后不会触发另一个SizeChanged事件。privatevoidSize_Changed(SizeChangedEventArgse){//此处处理大小结束的自定义代码已更改}您可以准确检测到WPF窗口调整大小结束的时间,并且不需要计时器。当用户在窗口调整大小或移动操作结束时释放鼠标左键时,本机窗口会收到WM_EXITSIZEMOVE消息。WPF窗口不接收此消息,因此我们需要连接一个将接收它的WndProc函数。我们可以使用HwndSource和WindowInteropHelper来获取窗口句柄。然后我们将钩子添加到我们的WndProc函数。我们将在窗口加载事件中执行所有操作(vb.net代码):(NewHwndSourceHook(AddressOfWndProc))EndSub现在,在我们的WndProc中,我们将监听WM_EXITSIZEMOVE消息:handledAsBoolean)AsIntPtrIfmsg=WM_EXITSIZEMOVEThenDoWhatYouNeed()EndIfReturnIntPtr.ZeroEndFunction此处和此处解释了此技术和类似技术。请注意,该函数应返回IntPtr.Zero。此外,除了处理您感兴趣的特定消息外,不要在此函数中执行任何操作。现在,WM_EXITSIZEMOVE也在移动操作结束时发送,我们只对调整大小感兴趣。有几种方法可以确定这是调整大小操作的结束。我通过监听WM_SIZING消息(在调整大小期间发送多次)和标志来做到这一点。整个方案所:((:不不不要对对此处处突出显示的的代码代码代码代码感到感到代码感到困惑感到感到困惑感到感到感到感到感到感到困惑突出突出突出突出突出突出突出突出处处处突出处处处处处处处处处处处处处处处处处处处处处突出处处突出突出处处突出处处处处处处处处处突出突出处处处处处处处处处处处处处处处处处处处处处处处处处处处处处处处处处处处处处处处,vb.net出错)SubWindowLoaded_(senderAsObject,eAsRoutedEventArgs)WinSource=HwndSource.FromHwnd(NewWindowInteropHelper(Me).Handle)WinSource.AddHook(NewHwndSourceHook(AddressOfWndProc))EndSubPrivateFunctionWndProc(hwndAsIntPtr,msgAsInteger,wParamAsIntPtr,lParamAsIntPtr,ByRefhandledAsBoolean)AsIntPtrIfmsg=WM_SIZINGThenIfWindowWasResized=FalseThen'指示用户正在调整窗口大小而不是移动窗口WindowWasResized=TrueEndIfEndIfIfmsg=WM_EXITSIZEMOVEThen'checkthatthisistheendofresizeandnotmoveoperationIfWindowWasResized=TrueThenDoWhatYouNeed()'setitbacktofalseforthenextresize/moveWindowWasResized=FalseEndIfEndIfReturnIntPtr.ZeroEndFunction并已。以上就是C#学习教程:如何捕捉结束调整窗口?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
