如何在WPF中处理LayoutUpdated事件或停止控件的渲染?

6
我希望取消、停止或处理渲染(或绘制)WPF元素以降低CPU使用率(取消所有永久动画和在后台或折叠可见性项目中的渲染,以便在我的应用程序中获得最佳性能)。
我阅读了所有优化WPF应用程序性能
void MainWindow_LayoutUpdated(object sender, EventArgs e)
    {
        e.Handled = true;//can i handle an object rendering?
    }

你找到了什么?有什么问题吗? - Bahman_Aries
我有一个数据网格,其中包含进度条项目...这些项目位于可展开面板中,isindeterminate = true。我希望如果可展开面板被折叠,则进度条的渲染停止...但它没有停止,我的应用程序 CPU 使用率非常高...如果我从应用程序中删除进度条,则 CPU 使用率较低...并且在渲染方面存在其他问题。我希望能够从 WPF 应用程序中管理渲染。 - Ali Yousefi
你的问题缺少足够的细节,你应该提供一些代码以展示你的“进度条”是如何工作的。 - Bahman_Aries
1个回答

13

LayoutUpdated事件并不能提供任何帮助。它是在完成整个布局后,与Dispatcher相关联的所有UI元素上触发的事件,也就是说工作已经完成了。

根据您的目标,您有几个选择。

隐藏元素

如果您不想让元素可见或执行任何布局,则可以将其Visibility属性设置为Collapsed。当它被折叠时,它应该跳过大部分布局逻辑和所有渲染逻辑。

删除元素

从可视树中删除元素是确保它不执行任何操作的方法。如果需要,您可以稍后再添加它。如何执行此操作取决于您的代码当前的设置方式。

降低元素性能成本

如果元素很昂贵,因为它正在执行许多工作,则可以考虑优化它,和/或在您不希望它执行工作的时间内断开其事件侦听器和绑定。

暂停UI处理

如果您要在执行某些操作时暂时暂停所有UI处理(以防止重入),则可以使用Dispatcher.DisableProcessing。请注意,这将禁用整个线程的UI处理,而不仅仅是特定元素的处理。

using (Dispatcher.DisableProcessing())
{
    // Do work while the dispatcher processing is disabled.
}

元素的静态图片

如果您想要永久禁用一个元素的所有处理,我不知道有什么方法可以保持其在屏幕上可见。但是,您可以使用RenderTargetBitmap将元素呈现为 ImageSource,然后用 Image 元素替换原始元素,使其 Source 属性设置为位图。

RenderTargetBitmap target = new RenderTargetBitmap((int)element.RenderSize.Width, (int)element.RenderSize.Height, 96.0, 96.0, PixelFormats.Default);
target.Render(element);
image.Source = target;

现在,您基本上拥有了一个“图片”,它代替了原始元素的位置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接