如何处理LayoutUpdated或停止WPF中的控件重新发送?

Ali*_*efi 3 c# wpf rendering

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

我阅读了所有优化WPF应用程序性能

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

Xav*_*ier 8

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

您有几个选择,具体取决于您的目标.

隐藏元素

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

删除元素

从可视化树中删除元素是一种确保它不做任何事情的可靠方法.如果需要,您可以稍后再添加.如何执行此操作的过程在很大程度上取决于您的代码当前的设置方式.

降低元素的性能成本

如果元素很昂贵,因为它做了很多工作,你可以考虑一般优化它,和/或在你不希望它工作的时候考虑断开它的事件监听器和绑定.

暂停UI处理

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

using (Dispatcher.DisableProcessing())
{
    // Do work while the dispatcher processing is disabled.
}
Run Code Online (Sandbox Code Playgroud)

元素的静态图片

如果你想永久禁用一个元素的所有处理,我不知道如何做到这一点,同时仍然保持在屏幕上可见.但是,您可以使用RenderTargetBitmap将元素呈现为a 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;
Run Code Online (Sandbox Code Playgroud)

现在你基本上有一个元素的"图片"代替原始元素的位置.