问题标签 [elementhost]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - ElementHost 重绘
我在我的WinForms应用程序中使用AvalonEdit 。AvalonEdit被放置在带有ElementHost的控件上。应用程序具有Telerik 的RadDock,并且AvalonEdit可以放置在其窗口上。我经常遇到ElementHost重绘的问题。我不知道所有的症状,但我可以通过改变焦点和在编辑器上移动其他窗口来重现这个问题。在此之后,我的应用程序中的所有 WPF 控件都损坏并且无法重新绘制。强制重绘ElementHost的唯一方法正在调整大小。我可以改变例如宽度和 WPF 控件将被重绘。但这种“解决方案”是不可接受的。在 x64 和 x86 机器上,可以为停靠或浮动窗口、带有或不带有活动滚动条的窗口重现该问题。要“修复” ElementHost,我需要重新启动应用程序。
有人对我有什么建议吗?
c# - ElementHost + FlowDocument = GC 不工作,内存不断增加
[更新,见底部!]
我们的 WinForms 应用程序FlowDocumentReader
在ElementHost
. 我在一个简单的项目中重新创建了这个问题并添加了下面的代码。
应用程序的作用
当我按下button1
:
UserControl1
仅包含 a 的AFlowDocumentReader
被创建并设置为ElementHost
'sChild
- A
FlowDocument
是从一个文本文件创建的(它只包含一个FlowDocument
带有StackPanel
几千行的 a<TextBox/>
) - 的
FlowDocumentReader
属性Document
设置为此FlowDocument
此时,页面呈现FlowDocument
正确。正如预期的那样,使用了大量内存。
问题
如果
button1
再次单击,内存使用量会增加,并且每次重复该过程时都会不断增加!尽管正在使用大量新内存,但 GC 并未收集!没有不应该存在的引用,因为:如果我按下
button2
which setelementHost1.Child
为 null 并调用 GC(参见下面的代码),会发生另一件奇怪的事情 - 它不会清理内存,但如果我继续点击它几秒钟,它最终会释放它!
对于我们来说,所有这些内存都被使用是不可接受的。此外,ElementHost
从Controls
集合中删除Disposing
它,将引用设置为 null,然后调用 GC 不会释放内存。
我想要的是
- 如果
button1
多次单击,内存使用量不应继续上升 - 我应该能够释放所有内存(这只是“真实”应用程序中的一个窗口,我想在它关闭时这样做)
这不是内存使用无关紧要的事情,我可以让 GC 随时收集它。它实际上最终显着减慢了机器的速度。
编码
如果您只想下载 VS 项目,我已在此处上传:http: //speedy.sh/8T5P2/WindowsFormsApplication7.zip
否则,这里是相关代码。只需将 2 个按钮添加到设计器中的表单并将它们连接到事件。Form1.cs:
UserControl1.xaml
编辑:
我终于有时间再处理这个问题了。我尝试的不是ElementHost
每次按下按钮时重用、处理和重新创建它。虽然这确实有点帮助,但从某种意义上说,当您点击按钮 1 时,内存会上升和下降,而不是仅仅上升,它仍然不能解决问题 - 内存总体上会上升,并且没有被释放表格已关闭。所以现在我要悬赏。
由于似乎对这里的问题有些混淆,以下是重现泄漏的确切步骤:
1) 打开任务管理器
2)点击“开始”按钮打开表格
3)垃圾邮件十几或两次点击“GO”按钮并观察内存使用情况 -现在你应该注意到泄漏
4a) 关闭表格 -内存不会被释放。
或者
4b)垃圾邮件“CLEAN”按钮几次,内存将被释放,说明这不是引用泄漏,是GC/finalization问题
我需要做的是在步骤 3) 中防止泄漏,并在步骤 4a) 中释放内存。实际应用程序中没有“CLEAN”按钮,它只是显示没有隐藏的引用。
在点击“GO”按钮几次后,我使用 CLR 分析器检查内存配置文件(此时内存使用量约为 350 MB)。事实证明,有 16125 个(文档中数量的 5 倍)Controls.TextBox
和 16125 个Controls.TextBoxView
都植根于 16125 个Documents.TextEditor
对象中,这些对象植根于终结队列中 - 请参见此处:
http://i.imgur.com/m28Auix.png
任何见解表示赞赏。
另一个更新 - 已解决(有点)
我刚刚在另一个不使用 anElementHost
或 a 的纯 WPF 应用程序中再次遇到了这个问题FlowDocument
,所以回想起来,这个标题具有误导性。正如 Anton Tykhyy 所解释的,这只是 WPFTextBox
本身的一个错误,它没有正确处理其TextEditor
.
我不喜欢 Anton 建议的解决方法,但他对错误的解释对我相当丑陋但简短的解决方案很有用。
当我要销毁包含 的控件的实例时TextBoxes
,我会这样做(在控件的代码隐藏中):
在哪里FindVisualChildren
:
基本上,我做TextBox
应该做的事情。最后我也打电话GC.Collect()
(不是绝对必要的,但有助于更快地释放内存)。这是一个非常丑陋的解决方案,但似乎可以解决问题。不再TextEditors
停留在完成队列中。
wpf - 当 ScrollBar 变得可见时 WPF Scrollviewer DesiredSize 不会增加
我有一个 WPF UserControl
(在一个内部ElementHost
),其中一个ScrollViewer
包含一个ItemsControl
. HorizontalScrollbarVisibility
设置为,因此Auto
如果不需要滚动,则会ScrollBar
隐藏 。
我的要求是,如果ScrollBar
显示/隐藏,ElementHost
确实会相应地调整它的高度。为了实现这一点,我正在听SizeChanged
事件,我得到了DesiredSize
中ScrollViewer
的EventHandler
,然后我传递DesiredSize.Height
给ElementHost
.
2.
3.
一种方法,这是可行的:在ScrollBar
可见的情况下(情况 1),我放大我的窗口,直到所有项目ItemsControl
都可见,ScrollBar
消失,ElementHost
调整到降低的高度(情况 2)。实际上在隐藏DesiredSize
的那一刻变小了。ScrollBar
但是,另一种方式不起作用:在ScrollBar
不可见的情况下(情况 2),我减小了窗口大小,直到 aScrollBar
是必要的并出现。DesiredSize
保持不变,并且ElementHost
不调整(情况3)。
有任何想法吗?
这是 的 xaml Scrollviewer
,有一些 MVVM 的东西,但不要挂断这个,关键是,为什么出现DesiredSize
时不增加ScrollBar
?为什么只是缩水?
ScrollViewer 样式(基本上是默认的 WPF):
c# - 当控件设置为透明时,控件中的黑色背景
我遇到了 WPF elementHost 背景色的问题。我有一个在面板中加载 UserControl(Winform) 的 winform。在该用户控件中,我有两个面板,在每个面板中,有一个 elementHost 承载 WPF 用户控件。
图片可能更有帮助:
如您所见,它们中的每一个的背景色都是黑色,而元素应显示如下:
我注意到当我在面板中加载其他用户控件时发生了这种情况。我需要知道如何解决这个问题。
每个 elementHost 都将其背景颜色设置为透明,并将背景颜色透明设置为 True。另外,我尝试在运行时更改背景颜色,但仍然是同样的问题。
更新: 好的,我注意到如果我在表单的加载事件中加载面板中的用户控件,则 elementHost 加载正确。但是,如果我在按钮单击事件中将 UserControl 加载到面板中,我会得到黑色背景色。
作品:
不要工作:
显然,仅当我使用一个 UserControl 时,使用 Load 事件才是解决方案,但我不是。
c# - Winform ElementHost 中的 MouseEnter 事件
我有一个带有 elementHost 的 Winform 以包含 WPF UserControl。我需要的是当鼠标进入elementHost而不是child时做一些事情。我试图在 elementHost 中使用 MouseEnter 事件,但它不存在。我有机会做到这一点吗?还是只是不可能?很好奇没有鼠标事件。
这是我所有的事件:
如果我想以编程方式进行,我只是没有任何 MouseEvent:
c# - 从元素宿主更改元素
我有DataGrid
几行:
DataGrid
坐在ElementHost
两个winfrom :
在一个窗口中我想隐藏一行,怎么做?(优先于 XAML)。
wpf - 将 wpf 元素主机绑定到 Winform
我有一个wpf element host
坐席winfrom
。
我想将元素的属性绑定到winfrom的属性。
在搜索中,我找到了相反的解决方案,将 winfrom 绑定到 wpf(当 win 位于 wpf 中时)。
这里的例子: 如何在WPF中绑定一个windows控件????
我也看到了这个答案(不完全是一个答案,我想说一个结论):Binding to a WPF hosting control's DependencyProperty in WinForms
它对我没有帮助..
我也想在 wpf element host 中保留 MVVM 的原理。
有办法做到这一点吗?
c# - c# windows窗体项目中WPF组件报错如何解决?
我已经创建了 Windows C# 项目。有一个 Windows 窗体。在同一个项目中,我创建了一个 WPF 组件,当我尝试将此组件放在 Windows 窗体上时,出现“无法创建组件”的错误。
请检查下面的链接以获取有关错误的更多详细信息。
1.当我从工具箱中拖动组件形成这个错误时:
2.当我在 ElementHost 中选择 WPF 组件时,出现此错误:
请帮帮我。
c# - 调整 wpf 元素主机大小时出现黑色闪回
我有一个WPF UserControl
显示在Winform
as中的Element Host
。
当我快速更改屏幕大小或调整大小时,我会在背景中看到黑色闪回,直到 UserControl 达到适当的大小。
我在几个地方读到过它。
我读到的所有地方都在谈论它只发生在UserControl 负载中并相应地带来解决方案。
我在Resize上看到过一个关于它的问题。但是那里提供的解决方案也是Load。
我尝试调整屏幕大小以执行以下操作:UserControl.CreateGraphics ();
它不会像上面的答案所说的那样留下黑线。
我想这是因为我在调整大小而不是加载时使用了它。
此外,我什么也找不到。
如果有人遇到此问题并找到解决方案,我很乐意回答。
c# - Elementhost 和弹出窗口
我遇到了问题Windows.Forms.ElementHost
。在主机中,我放置了一个 WPF UserControl
,其中我得到了一个Popup
.
一些代码:
所以在这个例子中,我得到的只是 a ElementHost
、 aUserControl
和 a Popup
(以及一个 ViewModel ,其中实现了弹出窗口的 IsOpen 变量PopUpVisible
)。
现在我得到了两个Buttons
……一个在UserControl
我的 WindowsForm 中,一个在我的带有 ElementHost 的 WindowsForm 中。
这两个按钮中的每一个都将 IsOpen 变量设置PopUpVisible
为true
。因此,如果我按下按钮,则会显示相同的弹出窗口。直到这一点,一切都很好。
现在我textbox
在弹出窗口中有一个...我单击它textbox
并开始给一些随机的东西小费...如果我按下我的 wpf 用户控件中的按钮,这可以工作!但是,如果我按下按钮,我的WindowsForm
事情就会开始变得奇怪!我在我的文本框中获得了焦点和所有内容,但文本框不会得到我的任何键盘提示。我检查并仔细检查了它......我肯定在文本框中得到了我的“键盘焦点”!
有点卡在这里...有人有想法吗?
亲切的问候。