ListView WPF: как управлять LargeChange и другими кнопками - PullRequest
1 голос
/ 28 октября 2011

У меня есть ScrollViewer, у которого есть источник предметов. Количество элементов в этом может исчисляться десятками тысяч и передаваться с веб-сервера. Мы уже устанавливаем эти два свойства:

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

Они прекрасно работают для перемещения большого пальца (кнопка в середине полосы прокрутки), но когда пользователь удерживает нажатой стрелку вниз или щелкает и удерживает нажатой клавишу DecreaseRepeatButton или IncreaseRepeatButton (невидимые кнопки над и под большой палец), отложенная прокрутка больше не соблюдается, а элементы прокручиваются в поле зрения и просматривают ресурсы сервера.

То, что я хотел бы сделать, это в два раза:

1) Используйте отложенную прокрутку для стрелок вниз / вверх. В отсутствие этого мы можем увеличить задержку кнопки повтора, чтобы удерживать кнопку не прокручивать непрерывно.

2) Обновите LargeChange кнопки поворота / уменьшения / увеличения, чтобы пользователь каждый раз прокручивал 10%.

Я уже пытался спуститься вниз по визуальному дереву для "PART_VerticalScrollBar" и установить LargeChange для System.Windows.Controls.Primitives.ScrollBar безрезультатно.

Я могу подключиться к свойству полосы прокрутки, и положение большого пальца обновляется, но затем я больше не могу перетаскивать большой палец.

Любая помощь будет принята с благодарностью.

1 Ответ

2 голосов
/ 28 октября 2011

Я получил его для работы с шаблоном управления. По-прежнему выглядит чертовски тяжело, но работает.

<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"))
...