【问题标题】:How can i handle LayoutUpdated or stop a control rendring in WPF?如何在 WPF 中处理 LayoutUpdated 或停止控件呈现?
【发布时间】:2015-08-13 06:51:52
【问题描述】:

我想取消或停止或处理渲染(或绘制)WPF 元素以降低 CPU 使用率(取消所有永久动画和在后台渲染或折叠的可见性项目以在我的应用中使用最佳性能)。

我阅读了所有Optimizing WPF Application Performance

void MainWindow_LayoutUpdated(object sender, EventArgs e)
    {
        e.Handled = true;//can i handle an object rendering?
    }

【问题讨论】:

  • 你发现了什么?有什么问题?
  • 我有一个数据网格,它们是进度条项目......这些在扩展器中并且 isindeterminate = true。我想要扩展器是否折叠进度条渲染停止...但它没有停止并且我的应用程序 cpu 使用率非常高...如果我从应用程序中删除进度条,cpu 使用率会降低..以及渲染中其他地方的问题。我想从 wpf 应用程序管理渲染。
  • 你的问题没有足够的细节,你应该提供一些代码来显示你的ProgressBars是如何工作的。

标签: c# wpf rendering


【解决方案1】:

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;

现在你基本上有了一个元素的“图片”来代替原始元素的位置。

【讨论】:

    猜你喜欢
    • 2011-02-19
    • 2011-12-14
    • 2014-09-19
    • 2016-08-16
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-12
    相关资源
    最近更新 更多