ListView WPF:如何操作LargeChange和其他按钮

时间:2011-10-28 00:00:47

标签: wpf performance scrollbar

我有一个包含物品来源的ScrollViewer。此项中的项目数可能达到数万,并从Web服务器流式传输。我们已经设置了这两个属性:

VirtualizingStackPanel.VirtualizationMode="Recycling" ScrollViewer.IsDeferredScrollingEnabled="True" 

这些工作非常适合拖动拇指(滚动条中间的按钮),但是当用户按住向下箭头或点击并按住DecreaseRepeatButton或IncreaseRepeatButton(隐藏按钮上方和下方)时拇指),延迟滚动不再受到尊重,项目滚动到视图中并咀嚼服务器资源。

我想做的是两个方面:

1)使用延迟滚动来显示向下/向上箭头。如果没有这个,我们可以增加重复按钮的延迟,因此按住按钮不会连续滚动。

2)更新减少/增加重复按钮的LargeChange,以便用户每次滚动10%。

我已经尝试下载“PART_VerticalScrollBar”的可视树,并在System.Windows.Controls.Primitives.ScrollBar上设置LargeChange无济于事。

我可以勾选滚动条的属性并更新拇指位置但是我再也无法拖动拇指。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

我让它使用控件模板。它仍然看起来很肮脏,但它确实有效。

<ControlTemplate x:Key="templateScroll"
                 TargetType="{x:Type ScrollBar}">
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="1*" />
                    <RowDefinition Height="Auto" />
                </Grid.RowDefinitions>

                <RepeatButton Grid.Row="0" 
                      Command="ScrollBar.LineUpCommand" Interval="1000" Style="{DynamicResource Scrollbar_LineButton}" Content=" ^" />

                <Track Grid.Row="1" Name="PART_Track">
                    <Track.DecreaseRepeatButton>
                        <RepeatButton Command="ScrollBar.PageUpCommand"  Interval="1000" />
                    </Track.DecreaseRepeatButton>
                    <Track.Thumb>
                        <Thumb />
                    </Track.Thumb>
                    <Track.IncreaseRepeatButton>
                        <RepeatButton Command="ScrollBar.PageDownCommand" Interval="1000"/>
                    </Track.IncreaseRepeatButton>


                </Track>

                <RepeatButton Grid.Row="2" Interval="1000" Command="ScrollBar.LineDownCommand" Style="{DynamicResource Scrollbar_LineButton}" Content=" v"  />
            </Grid>
        </ControlTemplate>

然后我通过获取PART_VerticalScrollBar并将其设置为后面的代码中动态应用模板:

scrollBarControl.SetValue(System.Windows.Controls.Primitives.ScrollBar.TemplateProperty, Me.Resources("templateScroll"))