ElementHost阻止鼠标事件
注意:我正在尝试解决鼠标问题,而不是已经解决的键盘问题 所以我正在创建一个Visual Studio 2015扩展名,在选项页面上工作. 我正在使用WPF,因此我使用ElementHost托管USerControl.起初,它没有接收键盘事件,所以我在以下方面实现了解决方案. 在窗口表格中的Elementhost 快速解决方案: a)在UserControl的已加载事件中,我确实: var s = HwndSource.FromVisual(this) as HwndSource; s?.AddHook(ChildHwndSourceHook); b)在Childhwndsourcehook()中,我做类似的事情: static IntPtr ChildHwndSourceHook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) { if (msg
0 2023-04-01
编程技术问答社区
ElementHost内的WPF控件的渲染问题
我有一个winforms控件,在内部我有一个TableLayoutPanel,它容纳多个ElementHosts,每个ElementHost包含一个WPF控件. 一切正常,除非控件的大小比窗口大,ScrollBar在那里;当我向下滚动时,控件会造成扭曲,如这样 - 在最大化窗口或重新尺寸时,可以正确控制渲染 (减少大小以使控件脱离可见区域,然后再次增加尺寸以使它们在可见区域中带回) 在同一窗口中只有WPF窗口中的Winforms控件不会发生这种情况.知道为什么会发生这种情况以及对此的任何解决方案? 解决方案 this.Loaded += delegate { var source = PresentationSource.FromVisual(this); var hwndTarget = source.CompositionTarget as HwndTarget; if (hwndTarget != null) {
26 2023-02-10
编程技术问答社区
ElementHost大小导致wpf打开/加载速度慢,内存使用量大
问题: 我们有一个Winforms应用程序,可以打开另一个WPF窗口.该窗口包含各种图标和文本,并且不过分复杂.回到主窗口,Winforms One,它还具有使用ElementHost嵌入的WPF控件(ElementHost专门设计以使Winforms可以托管WPF控件).但是,我们已经注意到,一旦此应用程序的内存使用量很高,第二个WPF窗口可能需要大量时间才能打开. 我们在VS2012中进行了一个小型测试应用程序,该应用程序能够复制问题.测试应用程序打开一个具有两个按钮的Winforms窗口; "添加4GB内存使用"和"打开WPF窗口". WPF窗口上有一个小图标(48*48),仅此而已. 当我们添加4GB内存使用情况并尝试首次打开窗口时,打开窗口大约需要7秒钟. 代码:我已经通过 bitbucket 公开获得了测试应用程序和源代码. 我们发现的东西: 该应用程序肯定是在64位运行的,因为它将以32位抛出OutofMemoryExceptions. 没有
36 2023-02-09
编程技术问答社区
在Window窗体的ElementHost中,WPF文本框不接受输入
我们正在在现有的Windows表单/MFC应用程序引擎(Rhino 3D)中开发WPF中的UI控件. 应用程序引擎公开了创建" dockbar"功能,从本质上讲,您可以将Windows表单控件放在子窗口内,该窗口可以停靠到引擎接口. 我试图将一个简单的WPF文本框放入elementhost控件中,该控件已添加到Dockbar中.乍一看,这似乎很好.但是,尝试在文本框中键入文本框后,实际上在文本框中显示了某些序列. delete , backspace ,复制,粘贴和选择文本工作.如果您键入A-Z,1-9等.这些键不会显示. 我已经搜寻了网络,并听说过 ElementHost.EnableModelessKeyboardInterop() ,但这仅适用于从表单创建的WPF窗口.我只是创建WPF USERCONTROL并在Element -Host控件中托管它们. 我看到了一个谈论dispatcher.run()的帖子,它有效,但打破了其余表格: System.
10 2022-11-30
编程技术问答社区
在WinForms应用程序中的ElementHost中不显示WPF控件
我在尝试托管在 WinForms 应用程序的 ElementHost 中的 WPF 控件有问题.该控件是我最初在一个单独的测试项目中开发的无外观自定义控件,该项目是一个 WPF 应用程序.在那里它显然工作正常,但在我的 WinForms 应用程序中,我得到的只是一个空白的灰色框,其中显示了 ElementHost. 这是我的 C# 代码,用于创建、填充和添加 ElementHost 到父控件: // This is my WPF control m_TabHostPanel = new TabHostPanel(); m_ElementHost = new ElementHost { Child = m_TabHostPanel, Dock = DockStyle.Top, Height = 34
52 2022-09-10
编程技术问答社区
ElementHost的布局问题
我有一堆 ElementHosts 正在加载到我的表单中.发生这种情况时,元素主机都显示为黑色背景.如果我将另一个控件放在前面,然后关闭另一个控件,则 ElementHosts 将正常重新绘制.经过一番谷歌搜索,我发现如果我将 ElementHost 子类化并在构造函数中执行此操作 using (CreateGraphics()) { } ElementHosts 都以良好的背景绘制....但是,每个元素主机需要大约 300 毫秒才能出现在表单上...而且它们按顺序出现...所以就像看着表单布局一样.... 当然,我手动调用了 SuspendLayout 和 ResumeLayout,但这不会改变结果. 这只是 Windows 窗体集成问题吗?或者我可以做些什么来使控件以合理的速度正确显示? 谢谢. 更新:我可以用非常简单的代码重现这个问题: public partial class TestControl2 : UserControl {
38 2022-09-10
编程技术问答社区
我如何将WPF尺寸转换为物理像素?
将WPF(独立于分辨率)宽度和高度转换为物理屏幕像素的最佳方法是什么? 我正在以winforms表单(通过ElementHost)显示WPF内容,并尝试确定一些尺寸逻辑.当操作系统在默认的96 DPI上运行时,我的工作正常.但是,当操作系统设置为120 dpi或其他一些分辨率时,它将不起作用,因为就winform而言,将其宽度为96的WPF元素实际上将是120个像素. 我在system.windows.systemparameters上找不到任何"每英寸像素"设置.我敢肯定,我可以使用WinForms等效(System.Windows.Forms.SystemInformation),但是有更好的方法来执行此操作(阅读:使用WPF API,而不是使用Winforms API并手动执行数学)?将WPF"像素"转换为真实屏幕像素的"最佳方法"是什么? 编辑:在屏幕上显示WPF控件之前,我也希望执行此操作.它看起来像Visual.pointToscreen可以给我正确的答案,
50 2022-08-31
编程技术问答社区
动态应用级资源在ElementHost中托管时不是动态的。
我在 WinForms 容器中托管 WPF UserControl.现在,我希望能够为 UserControl 设置主题/皮肤.为此,我有几个定义“皮肤"的资源字典.当我的应用程序启动时,我创建了一个“新 System.Windows.Application()",以便 Application.Current 存在.为了改变主题,旧皮肤被删除,新皮肤在运行时被合并到应用程序级资源字典中.但是,这不会更改 UserControl 中任何动态引用的资源.我在一个直接的 WPF 应用程序中尝试了这个,它工作得很好.我错过了什么,或者根本不可能做到这一点?顺便说一句,如果我在初始化 UserControl 之前将皮肤添加到应用程序资源中,它将起作用,但之后我无法更改皮肤. 以最基本的方式回购这个: 创建一个新的 WinForms 应用程序.将 WPF UserControl 添加到应用程序.这很简单:
136 2022-08-12
编程技术问答社区
当ScrollBar变得可见时,WPF Scrollviewer DesiredSize没有增加。
我有一个 WPF UserControl(在 ElementHost 内),其中的 ScrollViewer 包含一个 ItemsControl .HorizontalScrollbarVisibility 设置为 Auto,因此如果不需要滚动,则 ScrollBar 会被隐藏. 我的要求是,如果 ScrollBar 被显示/隐藏,ElementHost 会相应地调整它的高度.为此,我正在监听 SizeChanged 事件,我在 EventHandler 中获取 ScrollViewer 的 DesiredSize,然后将 DesiredSize.Height 传递给 ElementHost. 2. 3. 一种方法,这是可行的:在 ScrollBar 可见(情况 1)的情况下,我放大我的窗口,直到 ItemsControl 的所有项目都可见,ScrollBar 消失,ElementHost 调整到降低的高度(情况2).DesiredSize 实际上在 ScrollBar
122 2022-08-11
编程技术问答社区
WPF ShowDialog和ElementHost
是否可以从 WPF 用户控件(即 ElementHost 的子级)显示模态窗口,并将模态窗口的所有者/父级设置为包含表单控件? 我猜你不能这样做,因为 Owner 属性需要一个 Window 的实例,我想将它设置为 Element Host 控件的父级,这是一个旧的 Windows Forms Form 控件.只是想知道是否有解决方法或替代方法. 问题是当显示模态窗口并且用户切换到另一个应用程序,然后再返回时,模态窗口被隐藏并且用户无法与主窗口交互.这是因为 Windows 认为模态窗口仍然显示,但实际上没有显示,因为没有设置所有者/父关系. 干杯,詹姆斯. 解决方案 我正在使用 WindowInteropHelper 来解决这个问题: var wpfDialog = new MyWpfDialog(); var interopHelper = new WindowInteropHelper(wpfDialog) {
202 2022-08-11
编程技术问答社区
在Winform应用程序中使用ElementHost来托管一个WPF UserControl有什么缺点吗?
如果使用我问,因为一般来说,我觉得它需要花费很多时间为我创建一个新的wpf应用程序,其中一个看起来很棒的基本界面.在某种意义上,如果我创建一个新的WinForms应用程序并抛出一些控件,我最终会使用一个基本的接口,看起来和表现与许多其他应用程序类似但看起来不明显.如果我用WPF应用程序做同样的事情,我不觉得我达到相同的结果,我最终有一个"普通"应用程序,其中包含白色背景,除非我将角色改变为Designer并花费额外的时间来使它看起来一定的时间大大地. 然而,有些情况下,希望WPF是希望它相对易于创建风格化接口的情况.考虑一个视频播放器控制;在WPF中,我可以创建一些看起来非常好的和自定义的东西,但花费了更少的时间和精力,而不是Winforms控制.在这些情况下,我使用WPF是有道理的,因为我最终消费时间比我覆盖onpaint的时间更少: - ). 我意识到我正在使用很多主观术语,但这是我在原始问题背后的推理. 更新: 只是为了澄清我的"Video Player控制"示
3202 2022-07-19
编程技术问答社区