2

我一直在处理 WPF 中的一个小视图,其中包含一些Buttons和 a ListBox,其项目有一个包含 aCheckBox和 a的模板ContentPresenter。当我开始在ListBox上下ScrollBar移动时滚动。这是一个性能问题,我认为这是因为CheckBoxes. 我认为CheckBoxes有某种渲染动画需要几毫秒才能在滴答声中淡出并且运行同步,因此会出现滞后。

我可能是错的,也许是其他原因导致了这个问题。此外,作为旁注,因为这对你们来说可能很重要,我在英特尔 i5 上的 Windows 7 中运行该应用程序。

当我离开CheckBoxs模板时,一切都运行得非常顺利。

你们建议我怎么做?

我不知道如何禁用该动画,我不想要那种滞后的行为。

编辑:我的 ListBox 中有 5000 个项目

这是我的 XAML:

<ListBox ItemsSource="{Binding Source}">
   <ListBox.ItemTemplate>
    <DataTemplate>
        <StackPanel Orientation="Horizontal">
            <CheckBox IsChecked="{Binding Checked}"/>
            <ContentPresenter Content="{Binding Text}"/>
        </StackPanel>
    </DataTemplate>
   </ListBox.ItemTemplate>
</ListBox>

这是我的视图模型:

public class ViewModel
{
    public ViewModel()
    {
        this.Source = new ObservableCollection<ListItem>();
        for (int i = 0; i < 5000; i++)
        {
            this.Source.Add(new ListItem(){ Text = "test" + i, Checked = true });
        }
    }

    public ObservableCollection<ListItem> Source
    {
        get;
        set;
    }
}

public class ListItem
{
    public bool Checked
    {
        get;
        set;
    }

    public string Text
    {
        get;
        set;
    }
}

这是我的 MainWindow.cs:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = new ViewModel();
    }
}
4

1 回答 1

1

尝试使用VirtualizingStackPanel.VirtualizationMode="Recycling"以提高滚动期间的性能。在极端情况下,尝试使用ScrollViewer.IsDeferredScrollingEnabled="True"延迟滚动。有关更多信息,请参阅:

http://msdn.microsoft.com/en-us/library/cc716876.aspx

http://msdn.microsoft.com/en-us/library/cc716879.aspx

注意:您可以尝试在其他操作系统下运行此代码,例如:Windows XP。我有一种感觉,在 Windows 7 优化 WPF 渲染实现与 XP 不同。因为某些代码通常会转到 XP,但要通过七刹车(但也许我错了)。

PS 我发现了一篇不错的文章——“提高 WPF 中的滚动性能。作者:Cedric Dussud”。它可能有用。

于 2013-06-21T09:14:16.957 回答