您的位置:首页 > 健康 > 美食 > Winform中引入WPF控件后键盘输入无响应

Winform中引入WPF控件后键盘输入无响应

2025/1/10 0:32:21 来源:https://blog.csdn.net/weixin_42253874/article/details/142104305  浏览:    关键词:Winform中引入WPF控件后键盘输入无响应

引言

Winform中如何引入WPF控件的教程很多,对于我们直接通过ElementHost引入的直接显示控件,它是可以响应键盘输入消息的,但对于在WFP中弹出的窗体来说,此时是无法响应我们的键盘输入的。我们需要给它使能键盘输入。

1、使能键盘输入消息

简单来说就只有下面一句代码:

System.Windows.Forms.Integration.ElementHost.EnableModelessKeyboardInterop(window);

其中window是WPF窗体。

但我们在原有的WPF控件库中引入Winform的代码好像不太合适,这两个是完全不同的界面框架。

2、通用方法

通常我们的弹窗需要时单例模式,我这里采用一个静态类管理所有的单例。通过它的Add方法添加并返回WPF窗体。

    /// <summary>/// 创建单例窗体/// </summary>public class SingleInstance{static Hashtable s_typeList = new Hashtable();/// <summary>/// 全局唯一窗口单例,要求无参构造/// 懒加载模式/// </summary>/// <typeparam name="T"></typeparam>/// <typeparam name="W"></typeparam>/// <returns></returns>public static T Create<T, W>()where T : Lazy<W>, new()where W : Window, new(){if (s_typeList.ContainsKey(typeof(T))){if (s_typeList[typeof(T)] is not null)return (T)s_typeList[typeof(T)];else{T t = new T();s_typeList[typeof(T)] = t;t.Value.Closed += (s, e) => s_typeList[typeof(T)] = null;
#if NETFRAMEWORKWinformAction?.Invoke(t.Value);
#endifreturn t;}}else{T t = new T();s_typeList.Add(typeof(T), t);t.Value.Closed += (s, e) => s_typeList[typeof(T)] = null;
#if NETFRAMEWORKWinformAction?.Invoke(t.Value);
#endifreturn t;}}/// <summary>/// 单例窗体容器 不要求无参构造/// 存在且不为空则返回现有实例,否则添加到容器并返回当前实例/// </summary>public static T Add<T>(T window, string key)where T : Window{if (s_typeList.ContainsKey(key)){if (s_typeList[key] is not null)return (T)s_typeList[key];else{s_typeList[key] = window;window.Closed += (s, e) => s_typeList[key] = null;
#if NETFRAMEWORKWinformAction?.Invoke(window);
#endifreturn window;}}else{s_typeList.Add(key, window);window.Closed += (s, e) => s_typeList[key] = null;
#if NETFRAMEWORKWinformAction?.Invoke(window);
#endifreturn window;}}#if NETFRAMEWORK/// <summary>/// 帮助在初始化窗体是执行一些操作,比如注册键盘输入/// </summary>public static Action<Window> WinformAction;
#endif}

这里使用了前置处理器指示词C# 前置處理器指示詞 | Microsoft Learn

通过给WinformAction事件赋值达到自动注册目的

SingleInstance.SingleInstance.WinformAction = window =>
{                                         System.Windows.Forms.Integration.ElementHost.EnableModelessKeyboardInterop(window);
};

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com