高CPU负载

时间:2017-04-03 10:10:15

标签: wpf xaml treeview datatemplate hierarchicaldatatemplate

这是我的代码

<TreeView x:Name="MyTreeView" ItemsSource="{Binding MyDataList}" Grid.Row="0" ScrollViewer.VerticalScrollBarVisibility="Auto">
<TreeView.Resources>
    <HierarchicalDataTemplate DataType="{x:Type vm:ParentDataType}" ItemsSource="{Binding ChildsList}">
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}"/>
            <TextBlock Text=" [" Foreground="Blue"/>
            <TextBlock Text="{Binding ChildsList.Count}" Foreground="Blue"/>
            <TextBlock Text="]" Foreground="Blue"/>
        </StackPanel>
    </HierarchicalDataTemplate>
    <DataTemplate DataType="{x:Type vm:ChildDataType}">
        <uc:UCScheduleView DataContext="{Binding}" Visibility="{Binding IsResultLoad, Mode=OneWay, Converter={StaticResource BoolVisibilityConverter}}"/>
    </DataTemplate>
</TreeView.Resources>
<TreeView.ItemContainerStyle>
    <Style TargetType="{x:Type TreeViewItem}">
        <Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=TwoWay}"/>
    </Style>
</TreeView.ItemContainerStyle>

如您所见,我有TreeView并使用HierarchicalDataTemplateDataTemplate来显示我的数据。

这个XAML代码工作正常。因此,我得到一棵树,其中包含ParentDataType类型的第一级元素和类型为ChildDataType的第二级元素。

但是当CPU负载很高时,HierarchicalDataTemplate会停止匹配DataType,我会得到“MyModule.ViewModel.ParentDataType”(这是ToString() ParentDataType的结果1}}实例)在我的TreeView树的第一层。

但这不是全部。问题随机发生。应用程序启动后,树是空的。我可以将数据库中ParentDataType类型的第一个元素添加到MyDataList,并将第一级元素添加到树中。因此,如果第一次加载成功,那么从数据库加载所有其他数据不会导致问题,一切都会好的。但是如果在第一次从数据库加载时出现问题,那么从数据库加载所有其他数据也不会导致问题。因此,问题可能仅在从数据库加载第一个数据项时发生,并且在我重新启动应用程序之前不会发生。

所以,我描述了问题发生时的情况。正如问题标题中所提到的,只有在CPU负载较高时才会出现问题。我按照here所述模拟CPU加载,当加载~75%时出现问题。

看起来高CPU使用率会干扰WPF,因此尽管存在DataType属性,但在DataTemplate应用时WPF会跳过数据类型比较并执行ToString() ...

1 个答案:

答案 0 :(得分:0)

您应该使用虚拟化。也许WPF只是停止渲染模板而只显示字符串表示。

https://msdn.microsoft.com/en-us/library/cc716879