Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 窗口大小调整滞后于虚拟化列表框_Wpf_Performance_Xaml - Fatal编程技术网

Wpf 窗口大小调整滞后于虚拟化列表框

Wpf 窗口大小调整滞后于虚拟化列表框,wpf,performance,xaml,Wpf,Performance,Xaml,我有一个使用基本MVVM原则创建的WPF应用程序 在我的一个视图中,我有一个ListBox控件。它绑定到我的ViewModel上的一个可观察集合 大致布局如下: <UserControl> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto" /> <ColumnDefinition Width="*

我有一个使用基本MVVM原则创建的WPF应用程序

在我的一个视图中,我有一个
ListBox
控件。它绑定到我的ViewModel上的一个
可观察集合

大致布局如下:

<UserControl>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="Auto" />
        </Grid.ColumnDefinitions>
        <ListBox ItemsSource="{Binding Students}" 
                 ItemTemplate="{StaticResource Template_Student}"  />
        <ListBox ItemsSource="{Binding Logs}" />
    </Grid>
</UserControl>

<DataTemplate x:Key="Template_Student">
    <Grid Width="300" Height="85">
        <Grid.RowDefinitions>

        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <Image Grid.RowSpan="3" Margin="5 10"
               Height="65" Width="50"
               Source="{Binding Property7}">
        </Image>
        <StackPanel Grid.Column="1" Margin="2 10 2 2">
            <TextBlock>
                <Run Text="{Binding Property4, StringFormat=\{0\}\,}" FontWeight="Bold" FontSize="14" />
                <Run Text="{Binding Property5}" FontWeight="Bold" FontSize="14" />
                <Run Text="{Binding Property6, StringFormat=(\{0\})}" />
            </TextBlock>
            <TextBlock>
                <Run Text="Property1:" />
                <Run Text="{Binding Property1}" />
            </TextBlock>
            <TextBlock>
                <Run Text="Property2:" />
                <Run Text="{Binding Property2}" />
            </TextBlock>
            <TextBlock>
                <Run Text="Property3:" />
                <Run Text="{Binding Property3, Mode=OneWay}" />
            </TextBlock>
        </StackPanel>
    </Grid>
</DataTemplate>

ListBox
使用默认的
virtualzingstackpanel
,我通过Snoop确认它正在使用它,并且
virtualzingstackpanel.isvirtualization
是真的

ViewModel的
Students
属性中有大约1000个对象。没有那么重。大约11个启用了INPC的属性

在这种情况下,整个窗口的窗口重画会明显滞后

简单地恢复窗口大小或使其最大化会导致延迟超过一秒。向
日志
属性(也是非常轻量级对象的
可观察集合
)添加内容会导致窗口重画时延迟超过一秒

延迟似乎与两件事有关:

  • 列表框中的项目数。如果我把它减到10
    但是,滞后已经完全消失了。如果我做250个项目,它是
    明显但不可怕。500开始变差,1000开始变差
    实际数据集中的数字不可用
    
  • 问题的复杂性
    数据模板
    。如果我同时删除
    图像
    堆栈面板
    使用所有这些属性,性能会更好(类似于 100项(包含所有数据)。如果我在其中任何一个离开的话 表现又不好了
  • 我想知道这是否与我选择的布局方式有关(例如,所有
    网格
    列定义
    宽度
    自动
    *
    )。或者如果我只是做了一些完全错误的事情,破坏了虚拟化


    任何帮助都将不胜感激

    我有几乎完全相同的情景。结果表明,即使没有自定义模板,WPF ListBox对>100个项目的性能也非常差

    我不知道有任何开源或免费的替代方案,但我们尝试了(商业*)和它的替代品

    它有一系列的优化,对我们来说性能的提高是巨大的。由于列表中有大约500个项目和自定义模板,调整窗口大小的速度过去慢得离谱。现在很顺利了

    *我与Xceed没有任何关系