【问题标题】:Why WPF are rendering Collapsed or Hidden Controls?为什么 WPF 呈现折叠或隐藏控件?
【发布时间】:2015-08-09 06:28:23
【问题描述】:

我正在测试我的 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>

后面的代码:

    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;
    }

【问题讨论】:

  • 您是否尝试过将IsEnabled 也设置为false?这应该更有效地阻止项目使用 CPU。您的真实案例涉及多少项目?
  • 是测试 renderStack.IsEnabled = false;并且不工作... CPU 使用率没有改变
  • IsEnabled 通常不会改变控件的处理能力。 (取决于实现)如果您真的想让框架忽略您的控件,您应该将它们从树中删除,并在需要时将它们添加回来。
  • 是的,如果我从 StackPanel 删除控制。 cpu 使用率改为低...这是个好主意吗?有更好的方法吗?

标签: c# wpf render cpu-usage


【解决方案1】:

参考MSDN

可见性不可见的元素不参与输入 事件(或命令),不影响测量或排列 布局的passes,不按tab顺序,不会上报 在命中测试中。

也许问题出在 GUI 本身。您是否正在执行任何后台操作?

【讨论】:

  • 不,我没有执行任何后台操作。我想停止在后台操作中呈现控件。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2014-01-22
    • 2012-09-08
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 2013-01-01
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多