问题标签 [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.

0 投票
0 回答
496 浏览

c# - ElementHost 重绘

我在我的WinForms应用程序中使用AvalonEdit 。AvalonEdit被放置在带有ElementHost的控件上。应用程序具有Telerik 的RadDock,并且AvalonEdit可以放置在其窗口上。我经常遇到ElementHost重绘的问题。我不知道所有的症状,但我可以通过改变焦点和在编辑器上移动其他窗口来重现这个问题。在此之后,我的应用程序中的所有 WPF 控件都损坏并且无法重新绘制。强制重绘ElementHost的唯一方法正在调整大小。我可以改变例如宽度和 WPF 控件将被重绘。但这种“解决方案”是不可接受的。在 x64 和 x86 机器上,可以为停靠或浮动窗口、带有或不带有活动滚动条的窗口重现该问题。要“修复” ElementHost,我需要重新启动应用程序。
有人对我有什么建议吗?

0 投票
2 回答
2513 浏览

c# - ElementHost + FlowDocument = GC 不工作,内存不断增加

[更新,见底部!]

我们的 WinForms 应用程序FlowDocumentReaderElementHost. 我在一个简单的项目中重新创建了这个问题并添加了下面的代码。

应用程序的作用

当我按下button1

  • UserControl1仅包含 a 的AFlowDocumentReader被创建并设置为ElementHost'sChild
  • AFlowDocument是从一个文本文件创建的(它只包含一个FlowDocument带有StackPanel几千行的 a <TextBox/>
  • FlowDocumentReader属性Document设置为此FlowDocument

此时,页面呈现FlowDocument正确。正如预期的那样,使用了大量内存。

问题

  • 如果button1再次单击,内存使用量会增加,并且每次重复该过程时都会不断增加!尽管正在使用大量新内存,但 GC 并未收集!没有不应该存在的引用,因为:

  • 如果我按下button2which setelementHost1.Child为 null 并调用 GC(参见下面的代码),会发生另一件奇怪的事情 - 它不会清理内存,但如果我继续点击它几秒钟,它最终会释放它!

对于我们来说,所有这些内存都被使用是不可接受的。此外,ElementHostControls集合中删除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停留在完成队列中。

0 投票
1 回答
2193 浏览

wpf - 当 ScrollBar 变得可见时 WPF Scrollviewer DesiredSize 不会增加

我有一个 WPF UserControl(在一个内部ElementHost),其中一个ScrollViewer包含一个ItemsControl. HorizontalScrollbarVisibility设置为,因此Auto如果不需要滚动,则会ScrollBar隐藏 。

我的要求是,如果ScrollBar显示/隐藏,ElementHost确实会相应地调整它的高度。为了实现这一点,我正在听SizeChanged事件,我得到了DesiredSizeScrollViewerEventHandler,然后我传递DesiredSize.HeightElementHost.

  1. 可见的 2. 隐 3.不正确的,重叠的

一种方法,这是可行的:在ScrollBar可见的情况下(情况 1),我放大我的窗口,直到所有项目ItemsControl都可见,ScrollBar消失,ElementHost调整到降低的高度(情况 2)。实际上在隐藏DesiredSize的那一刻变小了。ScrollBar

但是,另一种方式不起作用:在ScrollBar不可见的情况下(情况 2),我减小了窗口大小,直到 aScrollBar是必要的并出现。DesiredSize保持不变,并且ElementHost不调整(情况3)。

有任何想法吗?

这是 的 xaml Scrollviewer,有一些 MVVM 的东西,但不要挂断这个,关键是,为什么出现DesiredSize时不增加ScrollBar?为什么只是缩水?

ScrollViewer 样式(基本上是默认的 WPF):

0 投票
2 回答
1512 浏览

c# - 当控件设置为透明时,控件中的黑色背景

我遇到了 WPF elementHost 背景色的问题。我有一个在面板中加载 UserControl(Winform) 的 winform。在该用户控件中,我有两个面板,在每个面板中,有一个 elementHost 承载 WPF 用户控件。

图片可能更有帮助: 在此处输入图像描述

如您所见,它们中的每一个的背景色都是黑色,而元素应显示如下:

在此处输入图像描述

我注意到当我在面板中加载其他用户控件时发生了这种情况。我需要知道如何解决这个问题。

每个 elementHost 都将其背景颜色设置为透明,并将背景颜色透明设置为 True。另外,我尝试在运行时更改背景颜色,但仍然是同样的问题。

更新: 好的,我注意到如果我在表单的加载事件中加载面板中的用户控件,则 elementHost 加载正确。但是,如果我在按钮单击事件中将 UserControl 加载到面板中,我会得到黑色背景色。

作品:

不要工作:

显然,仅当我使用一个 UserControl 时,使用 Load 事件才是解决方案,但我不是。

0 投票
1 回答
1654 浏览

c# - Winform ElementHost 中的 MouseEnter 事件

我有一个带有 elementHost 的 Winform 以包含 WPF UserControl。我需要的是当鼠标进入elementHost而不是child时做一些事情。我试图在 elementHost 中使用 MouseEnter 事件,但它不存在。我有机会做到这一点吗?还是只是不可能?很好奇没有鼠标事件。

这是我所有的事件:

在此处输入图像描述

如果我想以编程方式进行,我只是没有任何 MouseEvent:

在此处输入图像描述

0 投票
1 回答
297 浏览

c# - 从元素宿主更改元素

我有DataGrid几行:

DataGrid坐在ElementHost两个winfrom :

在一个窗口中我想隐藏一行,怎么做?(优先于 XAML)。

0 投票
1 回答
878 浏览

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 的原理。

有办法做到这一点吗?

0 投票
1 回答
521 浏览

c# - c# windows窗体项目中WPF组件报错如何解决?

我已经创建了 Windows C# 项目。有一个 Windows 窗体。在同一个项目中,我创建了一个 WPF 组件,当我尝试将此组件放在 Windows 窗体上时,出现“无法创建组件”的错误。

请检查下面的链接以获取有关错误的更多详细信息。

1.当我从工具箱中拖动组件形成这个错误时: 在此处输入图像描述

2.当我在 ElementHost 中选择 WPF 组件时,出现此错误: 在此处输入图像描述

请帮帮我。

0 投票
2 回答
2191 浏览

c# - 调整 wpf 元素主机大小时出现黑色闪回

我有一个WPF UserControl显示在Winformas中的Element Host

当我快速更改屏幕大小或调整大小时,我会在背景中看到黑色闪回,直到 UserControl 达到适当的大小。

我在几个地方读到过它。

我读到的所有地方都在谈论它只发生在UserControl 负载中并相应地带来解决方案。

我在Resize上看到过一个关于它的问题。但是那里提供的解决方案也是Load

调整元素主机大小时的黑色背景

我尝试调整屏幕大小以执行以下操作:UserControl.CreateGraphics ();它不会像上面的答案所说的那样留下黑线。

我想这是因为我在调整大小而不是加载时使用了它。

此外,我什么也找不到。

如果有人遇到此问题并找到解决方案,我很乐意回答。

0 投票
0 回答
351 浏览

c# - Elementhost 和弹出窗口

我遇到了问题Windows.Forms.ElementHost。在主机中,我放置了一个 WPF UserControl,其中我得到了一个Popup.

一些代码:

所以在这个例子中,我得到的只是 a ElementHost、 aUserControl和 a Popup(以及一个 ViewModel ,其中实现了弹出窗口的 IsOpen 变量PopUpVisible)。

现在我得到了两个Buttons……一个在UserControl我的 WindowsForm 中,一个在我的带有 ElementHost 的 WindowsForm 中。

这两个按钮中的每一个都将 IsOpen 变量设置PopUpVisibletrue。因此,如果我按下按钮,则会显示相同的弹出窗口。直到这一点,一切都很好。

现在我textbox在弹出窗口中有一个...我单击它textbox并开始给一些随机的东西小费...如果我按下我的 wpf 用户控件中的按钮,这可以工作!但是,如果我按下按钮,我的WindowsForm事情就会开始变得奇怪!我在我的文本框中获得了焦点和所有内容,但文本框不会得到我的任何键盘提示。我检查并仔细检查了它......我肯定在文本框中得到了我的“键盘焦点”!

有点卡在这里...有人有想法吗?

亲切的问候。