把WPF Dialog转成WinForm Dialog需要注意的问题续

本文介绍了一种解决WPF中模态对话框显示在主窗口后面的问题的方法。通过自定义类WpfModalDialogFixer,在显示模态对话框时确保其始终位于前台。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一篇讲到将WPF的窗口转为WinForm窗口需要注意的问题,这里给出了另一种解决方案,闲话不说,请看代码:

//============================================================================== // File Name : WpfModalDialogFixer.cs // // Copyright (C) 2010 GrapeCity Inc. All rights reserved. // // Distributable under LGPL license. // //============================================================================== // <fileinformation> // <summary> // This file defines the class WpfModalDialogFixer for solve the problem as below: // When showing a modal dialog which ShowTaskBar is false, first deactive the application the activate it again. // The modal dialog would be at behind of MainWindow. // </summary> // <author name="WinkingZhang" mail="Winking.Zhang@GrapeCity.com"/> // <seealso ref=""/> // <remarks> // // </remarks> // </fileinformation> // <history> // <record date="10/21/2010 6:07:04 PM" author="WinkingZhang" revision="1.00.000"> // Create the file and define the class. // </record> // </history> using System; using System.Threading; using System.Windows; using System.Windows.Interop; using System.Runtime.InteropServices; namespace GrapeCity.Windows { /// <summary> /// Represents the <see cref="WpfModalDialogFixer"/> class. /// </summary> public class WpfModalDialogFixer { [ThreadStatic] private static WpfModalDialogFixer _fixer; private static readonly object _rootSync = new object(); static WpfModalDialogFixer() { ComponentDispatcher.EnterThreadModal += new EventHandler(OnComponentDispatcherEnterThreadModal); ComponentDispatcher.LeaveThreadModal += new EventHandler(OnComponentDispatcherLeaveThreadModal); } private WpfModalDialogFixer() { } static void OnComponentDispatcherLeaveThreadModal(object sender, EventArgs e) { if (WpfModalDialogFixer.Current.Enable) { HwndSource src = HwndSource.FromVisual(Application.Current.MainWindow) as HwndSource; if (src != null) { src.RemoveHook(new HwndSourceHook(OnComponentDispatcherThreadPreprocessMessage)); } } } static IntPtr OnComponentDispatcherThreadPreprocessMessage(IntPtr hwnd, int message, IntPtr wparam, IntPtr lparam, ref bool handled) { // Need take care the message: WM_SETFOCUS, and if now in Modal dialog mode. if (message == 0x7 && ComponentDispatcher.IsThreadModal) { bool actived = false; foreach (Window w in Application.Current.Windows) { HwndSource src = HwndSource.FromVisual(w) as HwndSource; if (src != null /*&& src.Handle != hwnd*/) { if (IsWindowEnabled(src.Handle)) { w.Activate(); actived = true; break; } } } if (!actived) // in this case, caused by MessageBox.Show(...) { //TODO: how to handle? } handled = true; // set handled to prevent default implement. } return IntPtr.Zero; } static void OnComponentDispatcherEnterThreadModal(object sender, EventArgs e) { if (WpfModalDialogFixer.Current.Enable) { HwndSource src = HwndSource.FromVisual(Application.Current.MainWindow) as HwndSource; if (src != null) { src.AddHook(new HwndSourceHook(OnComponentDispatcherThreadPreprocessMessage)); } } } [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool IsWindowEnabled(IntPtr hwnd); public static WpfModalDialogFixer Current { get { if (_fixer == null) { lock (_rootSync) { if (_fixer == null) { _fixer = new WpfModalDialogFixer(); } } } return _fixer; } } public bool Enable { get; set; } } }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值