C# 如何冻结所有可冻结的WPF对象?

C# 如何冻结所有可冻结的WPF对象?,c#,wpf,performance,freeze,C#,Wpf,Performance,Freeze,我想冻结窗口中所有可冻结的对象。(以获得更好的性能) 为此,我使用了以下几个循环: foreach (Brush item in FindLogicalChildren<Brush>(myWin)) if( item != null && item.CanFreeze)item.Freeze(); foreach (Transform item in FindLogicalChildren<Transform

我想冻结窗口中所有可冻结的对象。(以获得更好的性能)

为此,我使用了以下几个循环:

    foreach (Brush item in FindLogicalChildren<Brush>(myWin))
                  if( item != null && item.CanFreeze)item.Freeze();

    foreach (Transform item in FindLogicalChildren<Transform>(myWin))
                   if( item != null && item.CanFreeze)item.Freeze();

    foreach (Geometry item in FindLogicalChildren<Geometry>(myWin))
                   if( item != null && item.CanFreeze)item.Freeze();
foreach(FindLogicalChildren(myWin)中的笔刷项)
如果(item!=null&&item.CanFreeze)item.Freeze();
foreach(FindLogicalChildren(myWin)中的转换项)
如果(item!=null&&item.CanFreeze)item.Freeze();
foreach(FindLogicalChildren(myWin)中的几何项)
如果(item!=null&&item.CanFreeze)item.Freeze();
但它不起作用

如何在任何可冻结的WPF对象上调用
Freeze()

编辑:

我刚刚意识到
FindLogicalChildren
什么也找不到,所以它不起作用

编辑2:

如何使用一个循环对任何可冻结的对象调用Freeze()

请帮助我。

我将使用以下内容(感谢您的回答):

公共静态IEnumerable FindVisualChildren(DependencyObject depObj),其中T:DependencyObject
{
if(depObj!=null)
{
for(int i=0;i

(我不能在这里测试我的代码)

你是对的,如果一切都冻结了,性能会得到真正的提升

您可以在XAML中执行此操作

在所有资源字典中,添加
ice
命名空间:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:ice="http://schemas.microsoft.com/winfx/2006/xaml/presentation/options">

然后,对于每个可冻结的XAML元素,冻结它。示例:

<SolidColorBrush ice:Freeze="True" x:Key="GlyphDisabledFillBrush" Color="{StaticResource Color_005}"/>
<LinearGradientBrush ice:Freeze="True" x:Key="PendingOrderPositiveBrush"  EndPoint="8,8" StartPoint="0,0" SpreadMethod="Repeat"  MappingMode="Absolute">
    <GradientStop ice:Freeze="True" Color="{StaticResource PendingOrderLightPositiveColor}" Offset="0"/>
    <GradientStop ice:Freeze="True" Color="{StaticResource PendingOrderLightPositiveColor}" Offset="0.44"/>
    <GradientStop ice:Freeze="True" Color="{StaticResource PendingOrderDarkPositiveColor}" Offset="0.44"/>
    <GradientStop ice:Freeze="True" Color="{StaticResource PendingOrderDarkPositiveColor}" Offset="0.6"/>
    <GradientStop ice:Freeze="True" Color="{StaticResource PendingOrderLightPositiveColor}" Offset="0.6"/>
    <GradientStop ice:Freeze="True" Color="{StaticResource PendingOrderLightPositiveColor}" Offset="1"/>
</LinearGradientBrush>

不冻结元素的好处
使用非冻结笔刷的唯一好处是,我们可以在运行时更改主题。如果我们不担心主题的变化,那么我们可以通过冻结所有画笔来获得良好的性能提升。冻结元素也是我们支持具有单独调度程序的多线程窗口的唯一方法。

FindLogical Children
是否有效?您对
的确切含义是什么,但它不起作用。
。如果您不告诉我们问题是什么,您希望我们如何提供解决方案
但它不起作用。
是通用的,它可能意味着从
任何事情,从
它工作得很完美,但不是我所期望的那样
它使我的电脑崩溃并使我的房子着火
@Manfred Radlwimmer,谢谢你的回复。我的意思是:虽然窗户里有几支钢笔和刷子,但孩子们一支也找不到。(对不起我的英语)我非常怀疑钢笔和画笔是否是元素的逻辑子元素。当然,它们可以被指定为填充、笔划、背景等,但这并不能使它们成为逻辑的子对象。我通常只在希望将资源传递给另一个线程或在代码中创建资源时冻结资源。我非常怀疑你在这里所做的一切是否有意义。@MitraM你能澄清一下,编辑后的答案是否与“不工作”的解决方案相关?它也不工作。我认为钢笔和画笔不是逻辑/视觉儿童。
<SolidColorBrush ice:Freeze="True" x:Key="GlyphDisabledFillBrush" Color="{StaticResource Color_005}"/>
<LinearGradientBrush ice:Freeze="True" x:Key="PendingOrderPositiveBrush"  EndPoint="8,8" StartPoint="0,0" SpreadMethod="Repeat"  MappingMode="Absolute">
    <GradientStop ice:Freeze="True" Color="{StaticResource PendingOrderLightPositiveColor}" Offset="0"/>
    <GradientStop ice:Freeze="True" Color="{StaticResource PendingOrderLightPositiveColor}" Offset="0.44"/>
    <GradientStop ice:Freeze="True" Color="{StaticResource PendingOrderDarkPositiveColor}" Offset="0.44"/>
    <GradientStop ice:Freeze="True" Color="{StaticResource PendingOrderDarkPositiveColor}" Offset="0.6"/>
    <GradientStop ice:Freeze="True" Color="{StaticResource PendingOrderLightPositiveColor}" Offset="0.6"/>
    <GradientStop ice:Freeze="True" Color="{StaticResource PendingOrderLightPositiveColor}" Offset="1"/>
</LinearGradientBrush>