none
WPF中ListBox的使用,在XP下导致CPU高的问题。 RRS feed

  • 问题

  •     <Style x:Key="UpAppListboxStyle" TargetType="ListBoxItem">
                <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="ListBoxItem">
                            <Button Margin="{Binding Margin}"  Width="{Binding Width}" Height="{Binding Height}" AllowDrop="True"
                                            HorizontalAlignment="Center" VerticalAlignment="Center"
                                            ToolTipClosing="DesktopIcon_ToolTipClosing" 
                                            Command="{Binding Path=DataContext.CommandOpen,RelativeSource={RelativeSource AncestorType=Window}}"
                                            CommandParameter="{Binding Path=DesktopAppHandler}"
                                            FocusVisualStyle="{x:Null}">
                                <Button.Template>
                                    <ControlTemplate>
                                        <Grid>
                                            <Grid.RowDefinitions>
                                                <RowDefinition Height="{Binding ImgSize}"/>
                                                <RowDefinition Height="*"/>
                                            </Grid.RowDefinitions>
                                            <Border Grid.Row="0" Grid.RowSpan="2" CornerRadius="5" Padding="1,1,1,1" Margin="0,-10,0,0" Background="Transparent" Name="itemGrid" BorderBrush="Transparent" Width="{TemplateBinding Width}" Height="{TemplateBinding Height}" BorderThickness="0.3" />
                                            <Image Grid.Row="0" Name="img" Height="{Binding ImgSize}" Width="{Binding ImgSize}" Source="{Binding  Path=DesktopAppHandler.IconImage}"/>
                                            <TextBlock Grid.Row="1" FontSize="{Binding FontSize}" Foreground="#333333" Text="{Binding  Path=DesktopAppHandler.Name}" HorizontalAlignment="Center" VerticalAlignment="Center" TextAlignment="Center" TextWrapping="Wrap" TextTrimming="CharacterEllipsis" />
                                        </Grid>
                                        <ControlTemplate.Triggers>
                                            <Trigger Property="IsMouseOver" Value="True">
                                                <Setter TargetName="itemGrid" Property="Background" Value="#C1E2F8"/>
                                                <!--<Setter TargetName="itemGrid" Property="BorderBrush" Value="#1A94E6"/>-->
                                                <Setter Property="Cursor" Value="Hand"/>
                                            </Trigger>
                                        </ControlTemplate.Triggers>
                                    </ControlTemplate>
                                </Button.Template>
                            </Button>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>

    上述代码 生成了一个 上面是图片 ,下面是文字为单元的列表项。
    在UI界面上,鼠标滑动在列表项上时,显示边框。

    在鼠标滑动的过程中,CPU使用迅速上升到极高,主要可能是由于MouseOver会导致窗体重绘引起的。

    有知道的请给出点优化建议,谢谢。

    PS:在win8上使用CPU很正常,在xp上使用时CPU极高,希望有优化空间。

    2014年4月3日 2:44

答案

  • 第一:MouseOver的重绘是trigger事件,不会产生短时间过于多次的触发,可以排除此类原因。

    第二:楼上的建议VirtualizingStackPanel.IsVirtual其实是listbox类似lazy load的视觉机制,因为你是在鼠标滑动的时候产生的CPU升高。所以应该也不是此类解决方法。

    楼主情况 XP和WIN8 CPU占用率有差别。我用XP虚拟机,是OK的。应该是那台XP机器的问题。感觉你可以用.NET FRAMEWORK CLEAN TOOL 清理后重装下.NET FRAMEWORK 尝试一下。

    还不行就使用WPF Performance Suite来进行测试。这个一定可以查得到具体出现问题的地方,再根据这个来查找原因的。

    希望可以采纳

    2014年4月8日 5:33
  • 你好,

    我看了这个样式,从我这边看,没有特别的元素/属性能够造成XP CPU突然升高。我应用了这个样式创建了一个程序,CPU消耗正常。我对这个问题做了一些调查。

    1. 建议给XP打上最新的补丁包,并且安装.NET的最新补丁;
    2. 这个程序可以在Windows XP/8上面运行,那么同时支持的.NET Framework是4.0的。也打上关于4.0的最新补丁;
    3. 在一些资料中,有人建议给增加这个属性,可以尝试一下:

    VirtualizingStackPanel.IsVirtual="False"

    4. 如果上述3点不能帮助到你,建议提供一个可以运行的例子,还有当前的工作环境,包括.NET版本,WIN XP版本等。可以把例子上传到SkyDrive或者其他可以下载的地方即可。

    Update: 你可以参考这篇文章,对程序进行一个优化,

    http://wpftutorial.net/10PerformanceTips.html

    谢谢!


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年4月4日 2:47
    版主

全部回复

  • 你好,

    我看了这个样式,从我这边看,没有特别的元素/属性能够造成XP CPU突然升高。我应用了这个样式创建了一个程序,CPU消耗正常。我对这个问题做了一些调查。

    1. 建议给XP打上最新的补丁包,并且安装.NET的最新补丁;
    2. 这个程序可以在Windows XP/8上面运行,那么同时支持的.NET Framework是4.0的。也打上关于4.0的最新补丁;
    3. 在一些资料中,有人建议给增加这个属性,可以尝试一下:

    VirtualizingStackPanel.IsVirtual="False"

    4. 如果上述3点不能帮助到你,建议提供一个可以运行的例子,还有当前的工作环境,包括.NET版本,WIN XP版本等。可以把例子上传到SkyDrive或者其他可以下载的地方即可。

    Update: 你可以参考这篇文章,对程序进行一个优化,

    http://wpftutorial.net/10PerformanceTips.html

    谢谢!


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年4月4日 2:47
    版主
  • 谢谢,稍后我对现有程序针对你的建议做些优化,再看看情况。

    2014年4月8日 4:44
  • 第一:MouseOver的重绘是trigger事件,不会产生短时间过于多次的触发,可以排除此类原因。

    第二:楼上的建议VirtualizingStackPanel.IsVirtual其实是listbox类似lazy load的视觉机制,因为你是在鼠标滑动的时候产生的CPU升高。所以应该也不是此类解决方法。

    楼主情况 XP和WIN8 CPU占用率有差别。我用XP虚拟机,是OK的。应该是那台XP机器的问题。感觉你可以用.NET FRAMEWORK CLEAN TOOL 清理后重装下.NET FRAMEWORK 尝试一下。

    还不行就使用WPF Performance Suite来进行测试。这个一定可以查得到具体出现问题的地方,再根据这个来查找原因的。

    希望可以采纳

    2014年4月8日 5:33
  • 已经找到了原因。

    在窗体上设置了AllowsTransparency=“True”属性导致的。

    去掉该属性,窗体设置为 WindowStyle="None", 在XP上也可看到窗体周边的一圈轮廓。

    看来AllowsTransparency属性在XP下性能较差。

    2014年4月8日 8:22