C# 为什么WPF渲染折叠或隐藏的控件?

C# 为什么WPF渲染折叠或隐藏的控件?,c#,wpf,render,cpu-usage,C#,Wpf,Render,Cpu Usage,我正在测试我的WPF应用程序。我对这个项目的性能有问题 为什么WPF渲染折叠或隐藏的控件 如果我折叠或显示控件,我的CPU使用率不会改变 例如: <Grid> <Grid.RowDefinitions> <RowDefinition Height="auto"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <Stac

我正在测试我的WPF应用程序。我对这个项目的性能有问题

为什么WPF渲染折叠或隐藏的控件

如果我折叠或显示控件,我的CPU使用率不会改变

例如:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <StackPanel Orientation="Horizontal" Height="30">
        <Button Content="visible" Margin="5" Padding="5,0,5,0" Click="Button_Click"/>
        <Button Content="hidden" Margin="5" Padding="5,0,5,0" Click="Button_Click_1"/>
        <Button Content="collapsed" Margin="5" Padding="5,0,5,0" Click="Button_Click_2"/>
    </StackPanel>
    <StackPanel Grid.Row="1" x:Name="renderStack">
        <ProgressBar Height="30" IsIndeterminate="True"/>
        <ProgressBar Height="30" IsIndeterminate="True"/>
        <ProgressBar Height="30" IsIndeterminate="True"/>
        <ProgressBar Height="30" IsIndeterminate="True"/>
        <ProgressBar Height="30" IsIndeterminate="True"/>
        <ProgressBar Height="30" IsIndeterminate="True"/>
        <ProgressBar Height="30" IsIndeterminate="True"/>
        <ProgressBar Height="30" IsIndeterminate="True"/>
        <ProgressBar Height="30" IsIndeterminate="True"/>
        <ProgressBar Height="30" IsIndeterminate="True"/>
        <ProgressBar Height="30" IsIndeterminate="True"/>
        <ProgressBar Height="30" IsIndeterminate="True"/>
    </StackPanel>
</Grid>
参考MSDN

可见性不可见的图元不参与输入 事件(或命令)不会影响测量或排列 布局的过程不在选项卡序列中,并且不会报告 在命中测试中


也许问题在于GUI本身。你在执行任何后台操作吗?

我知道这很旧,但只是以防万一有人来看。我发现,即使对象隐藏得更多,当进度条设置为“不确定”时,在隐藏或折叠时仍会占用处理器,因为它仍在渲染动画。在隐藏或折叠它的同时尝试使用.IsIndeterminate=False,您会看到cpu使用率下降。

您是否也尝试将
IsEnabled
设置为False?这将更有效地阻止项目使用CPU。您的实际案例中涉及到多少项?是,renderStack.IsEnabled=false;而不是工作。。。CPU使用率未更改停用通常不会更改控件的处理能力。(取决于实现)如果确实要使框架忽略控件,则应将其从树中删除,并在需要时重新添加。如果我从StackPanel中删除控件,则为“是”。cpu使用率已更改为低。。。这是个好主意吗?有更好的方法吗?不,我不执行任何后台操作。我想停止在后台操作中渲染控件。
    private void Button_Click(object sender, RoutedEventArgs e)
    {
        renderStack.Visibility = System.Windows.Visibility.Visible;
    }

    private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        renderStack.Visibility = System.Windows.Visibility.Hidden;
    }

    private void Button_Click_2(object sender, RoutedEventArgs e)
    {
        renderStack.Visibility = System.Windows.Visibility.Collapsed;
    }