自定义控件上的WPF 4.0平滑滚动和UI可视化

时间:2013-12-28 10:36:43

标签: c# wpf user-interface smooth-scrolling

我的自定义控件应包含1000000个项目。我已经实现了基于ItemsControl的自定义控件。控件的源XAML是:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:behaviors="clr-namespace:MyTestApplication.Behaviors"
                    xmlns:helpers="clr-namespace:MyTestApplication.Helpers"
                    xmlns:local="clr-namespace:MyTestApplication.Controls"
                    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity">

    <Style TargetType="{x:Type local:RowsWrapperControl}">

        <Setter Property="ItemsPanel">
            <Setter.Value>
                <ItemsPanelTemplate>
                    <VirtualizingStackPanel Orientation="Vertical" />
                </ItemsPanelTemplate>
            </Setter.Value>
        </Setter>

        <Setter Property="VirtualizingStackPanel.VirtualizationMode" Value="Recycling" />
        <Setter Property="VirtualizingStackPanel.IsVirtualizing" Value="True" />

        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:RowsWrapperControl}">
                    <ScrollViewer x:Name="PART_ItemsScrollViewer"
                                  Margin="{TemplateBinding Margin}"
                                  Background="{TemplateBinding Background}"
                                  BorderBrush="{TemplateBinding BorderBrush}"
                                  BorderThickness="{TemplateBinding BorderThickness}"
                                  CanContentScroll="True"
                                  HorizontalScrollBarVisibility="Disabled"
                                  Padding="{TemplateBinding Padding}"
                                  VerticalScrollBarVisibility="Hidden">
                        <i:Interaction.Behaviors>
                            <behaviors:ScrollViewerOffsetBehavior VerticalOffset="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=VerticalScrollOffset, Mode=OneWay}" />
                        </i:Interaction.Behaviors>
                        <ItemsPresenter />
                    </ScrollViewer>
                </ControlTemplate>
            </Setter.Value>
        </Setter>

    </Style>

</ResourceDictionary>

虚拟化效果很好,但滚动只能逐个项目,而不是像素逐个。我试图将CanContentScroll属性设置为False,但它会破坏可视化。我发现一些有用的 信息herehere,但对我没有任何影响。

知道如何打开平滑滚动吗?

我的PC上安装了.Net 4.5,但目标平台是.Net 4.0。

更新 找到了解决方案here

1 个答案:

答案 0 :(得分:0)

你有一个简单的数据列表或类似树的数据结构吗?您的自定义控件应该做什么或应该做什么?只有WPF .NET 4.0中的TreeView支持按像素滚动。 ListBox按项目/单位滚动。从TreeView派生您的自定义控件,你应该做得很好。或者将其包装在TreeView中。 TreeView还可以显示没有分层结构的简单数据列表。我实际上让许多人告诉我他们将他们的列表放在TreeView中只是为了获得像素滚动效果,因为它看起来比跳过项目/单位/数据更好,无论你怎么称呼它。

尝试一下:)我可以将其作为评论,因为它太大但如果有效则将其标记为答案。