问题标签 [visualbrush]
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.
wpf - WPF“懒惰”VisualBrush
我现在正在尝试像“懒惰”的 VisualBrush 那样实现一些东西。有人知道怎么做吗?含义:行为类似于 VisualBrush 但不会在 Visual 中的每次更改时更新,但最多每秒一次(或其他)。
我最好应该提供一些背景,为什么我要这样做,我猜我已经尝试过什么:)
问题:我现在的工作是提高一个相当大的 WPF 应用程序的性能。我追踪了应用程序中使用的一些视觉画笔的主要性能问题(无论如何都是在 UI 级别)。该应用程序由一个带有一些相当复杂的用户控件的“桌面”区域和一个包含缩小版桌面的导航区域组成。导航区域正在使用视觉画笔来完成工作。只要桌面项目或多或少是静态的,一切都很好。但是如果元素经常变化(例如因为它们包含动画),VisualBrushes 就会变得疯狂。它们将随着动画的帧速率而更新。降低帧率当然有帮助,但我正在寻找更通用的解决方案来解决这个问题。而“源” 控件仅渲染受动画影响的小区域视觉画笔容器被完全渲染导致应用程序性能下降。我已经尝试使用 BitmapCacheBrush 代替。不幸的是没有帮助。动画在控件内部。所以无论如何都必须刷新刷子。
可能的解决方案:我创建了一个或多或少类似于 VisualBrush 的控件。它需要一些视觉效果(如 VisualBrush),但使用 DiapatcherTimer 和 RenderTargetBitmap 来完成这项工作。现在我正在订阅控件的 LayoutUpdated 事件,每当它发生变化时,它都会被安排为“渲染”(使用 RenderTargetBitmap)。然后由 DispatcherTimer 触发实际渲染。这样,控件将以 DispatcherTimer 的频率最大重新绘制自身。
这是代码:
到目前为止,这工作得很好。唯一的问题是触发器。当我使用 LayoutUpdated 时,即使视觉本身根本没有改变(可能是因为应用程序其他部分的动画或其他原因),也会不断触发渲染。LayoutUpdated 只是经常被解雇。事实上,我可以跳过触发器并使用计时器更新控件而无需任何触发器。没关系。我还尝试在 Visual 中覆盖 OnRender 并引发自定义事件来触发更新。也不起作用,因为当 VisualTree 内部的某些内容发生更改时,不会调用 OnRender。这是我现在最好的镜头。它已经比原来的 VisualBrush 解决方案好得多(至少从性能的角度来看)。但我仍在寻找更好的解决方案。
有谁知道如何 a) 仅在 nessasarry 时触发更新或 b) 以完全不同的方法完成工作?
谢谢!!!
c# - 将 WPF 视觉对象渲染为图像会产生纯黑色图像
在 C#/WPF 应用程序中,我有一个需要保存到图像的 DataChart 对象。目前,该对象已添加到固定文档并使用以下代码正确显示在该固定文档上:
然而,与其将它作为一个块添加到固定文档中,我现在只需将图像保存到磁盘。我尝试过执行以下操作:
然而,这只是给了我图表大小的纯黑色图像,我不知道为什么。
所以我的问题是,有谁知道将 DataChart 对象转换为我可以保存的 PNG 或 BMP 图像的更好方法?我已经尝试搜索从 VisualBrush 或 Rectangle 到图像,但除了上述之外,没有找到任何似乎可以满足我需要的东西。
非常感谢!
memory-leaks - WPF - 带有 OpacityMask/VisualBrush 的边框:内存泄漏
关于我的应用程序的简要说明:
我正在开发的应用程序就是这样的贺卡设计师。想象一下,其中有一个背景图像,以及无限数量的“层”(特别是图片)留在背景上,可以移动、调整大小、前后移动等等......
也可以对这些图层应用特定的形状,如星形、椭圆形,.. 制作卡片后,可以保存为 jpeg 文件。
问题
一切正常,但我检测到当形状应用于图层时,会产生内存泄漏。
下面是每一层的UserControl的代码:
其中 MaskConverter 代码如下:
参数“MyMask.Data”是我从包含不同形状的文本文件动态加载的 XAML路径(即我正在应用的形状)。
所以,原则是,如果我有名为*im_the_problem*的边界,则不会释放内存。如果我评论*im_the_problem*(所以我只会有没有形状的矩形图层/图片),一切都像魅力一样工作,没有内存泄漏。
问题应该出在 OpacityMask + VisualBrush 中。
难道我做错了什么?还是有已知问题?有没有办法以不同的方式做同样的事情(将形状应用于图片..)?
谢谢。
c# - Window 中的 VisualBrush 保留以前 VisualBrush 的图像
使用 VisualBrush,我正在拍摄包含 TabControl 的窗口的快照。
快照#1:
切换到“Dos”(不是 Microsoft),快照 #2:
如果我只是拍一张 TabControl 或 DockPanel 的照片,一切正常,这个问题特别适用于拍摄 Window 的照片。帮助!!
后面的代码:
xml:
c# - WPF - 将容器的内容克隆为几何图形
好吧,我在使用视觉刷尝试从大画布的各个部分打印页面时运气不佳。一般工作,但往往会光栅化某些部分并产生不良输出。(我以前问过这个问题)。
所以现在我正在创建一堆内容相同的画布副本,并缩小到各个部分以打印为单个页面。这可行,但显然很慢,并且只会随着更多页面而变慢。
那么可能运作良好的是,是否有某种方法可以做类似于视觉画笔的事情,而是让它从其“视图”中复制内容作为某种新的几何对象?我的画布的内容是线条、图像等的组合,所以最好能够定义画笔的视图并告诉它将所有矢量和光栅对象的交集复制到一个新的某种容器。
这将允许我使用单个画布,并在不同位置拍摄内容的“快照”以用于打印各个页面。
c# - 使用 VisualBrush 获取 WPF 区域的 System.Drawing.Bitmap
关键是,我需要转换为 System.Drawing.Bitmap (.Net Framework 2.0) 以获取 WPF 网格的单帧及其内容。
我读过VisualBrush
,DrawingBrush
但我无法想象它应该如何工作。
我可以成功地将任何 WPFBitmapSource
转换为我的System.Drawing.Bitmap
。但是如何BitmapSource
从我的网格接收呢?
谢谢
c# - 在 Grid 控件上绘制捕捉图案
我有一个我使用的解决方案,但它并没有真正为我提供我需要的所有能力。
现在,我将 Grid 控件的背景设置为 VisualBrush,该 VisualBrush 在其 Visual 容器上包含一个椭圆。这使我无法在绘制的正方形后面设置背景颜色(或至少据我所知)。
我使用这些方块作为我的捕捉定位功能的标记。见图。
有没有办法让我保留我的背景图案并设置背景颜色?另一种方法也很受欢迎,因为我觉得我已经对这个方法感兴趣了,因为它(部分)有效。
由于需求:
这就是我为 grid.Background 设置的。我想要做的是绘制我在链接中显示的图案,并且还能够为背景设置颜色,上面带有点图案。
wpf - VisualBrush 做“懒惰评估”?
我在更多迭代(每次迭代一页)中创建 FixedDocument,如下所示:
在每次迭代中,我都会稍微更改 MainGrid。所以每个页面都应该包含 MainGrid 的实际状态。但是打印的文档包含与上次迭代内容相同的页面(换句话说 - 最后一个状态在文档的所有页面上)。VisualBrush有什么“懒惰的评价”之类的吗?
wpf - 使用存储在一个固定(流)文档中的 VisualBrush 及时控制快照
我需要及时拍摄 Control 的快照并将它们存储在一个 FixedDocument 中。问题是 VisualBrush 在某种程度上是“懒惰的”,并且不会通过将其添加到文档来评估自己。当我最终创建文档时,所有页面都包含相同(最后)状态的控制。虽然 VisualBrush 不能被冻结,但还有其他机会吗?我想在一页上有更多快照,因此逐页生成文档对我来说不是解决方案。Aswel 将 VisualBrush 转换为位图(我想将它保存在矢量中)。简而言之 -I need to somehow Freeze() VisualBrush
c# - RenderTargetBitmap 不遵守 ColumnDefinitions 宽度
我需要创建带有一些隐藏列的 Grid 快照(通过将其设置为 ColumnDefinition.Width = 0)。
在屏幕上看起来不错,但created image
所有列都可见(does not respect the ColumnDefinitions)
。我在某处发红,这是因为 RenderTargetBitmap 正在查看不存在这些更改的不同层(视觉层与布局层)。是否有机会使用正确的 ColumnDefinitions 获得网格的真实快照?我不能简单地使用 Rectagnel.Fill = VisualBrush,因为我需要循环存储这些图像(每次迭代 = 新图像)。
我尝试了像这个片段这样的方法