我如何处理 LayoutUpdated 或停止 WPF 中的控件呈现?

How can i handle LayoutUpdated or stop a control rendring in WPF?

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

我读完了Optimizing WPF Application Performance

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

LayoutUpdated 根本帮不了你。这是一个在 UI 与 Dispatcher 关联的所有 UI 元素上触发的事件 完整布局传递已完成,这意味着工作已经完成。

根据您的目标,您有多种选择。

隐藏元素

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

删除元素

从可视化树中删除元素是防止它做任何事情的可靠方法。如果需要,您可以稍后将其添加回来。如何执行此操作的过程在很大程度上取决于您的代码当前的设置方式。

降低元素的性能成本

如果该元素因为需要做很多工作而很昂贵,您可以考虑对其进行总体优化,and/or考虑在您不想要的时候断开它的事件侦听器和绑定它在工作。

暂停UI处理中

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

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

元素的静态图片

如果您想永久 禁用对某个元素的所有处理,我不知道有什么方法可以做到这一点,同时仍然保持它在屏幕上可见。但是,您可以使用将 Source 属性 设置为位图的 RenderTargetBitmap to render the element to an ImageSource and then replace the original element with an Image 元素。

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

现在你基本上有了一个 "picture" 元素来代替原来的元素。