Свойство SmallChange
в WPF ScrollBar
рассматривается только для прокрутки, когда полоса прокрутки является автономной (это означает, что не в ScrollViewer
).Поскольку вы используете ScrollViewer
в своем шаблоне управления, это никогда не сработает.A ScrollViewer
всегда будет применять небольшое изменение по умолчанию, равное 16 единицам.
Теперь у вас есть две опции:
- Реализация
IScrollInfo
в классе оболочки (например, производном от ContentControl
), присоедините его к просмотру прокрутки в качестве содержимого, поместите TabPanel
внутрь этого настраиваемого класса-оболочки, установите для свойства CanContentScroll
ScrollViewer
значение true
.Теперь у вас есть полный контроль над прокруткой. - Используйте небольшой хак: создайте внешний
ScrollBar
и позвольте ему прокручивать ScrollViewer
.
Я покажу вам второй подход:
Под ScrollViewer
, добавьте новую полосу прокрутки:
<ScrollBar
x:Name="myScrollBar"
Grid.Row="0" Grid.Column="1" Orientation="Horizontal"
Visibility="Collapsed"
Tag="{Binding ElementName=sv}"
Minimum="0"
Maximum="{Binding ScrollableWidth, ElementName=sv}"
ViewportSize="{Binding ViewportWidth, ElementName=sv}"
Value="{Binding HorizontalOffset, ElementName=sv, Mode=OneWay}"
SmallChange="100"
Scroll="MyScrollBar_OnScroll"/>
Вы можете изменить SmallChange
свойство по вашему желанию.
Обновите обе команды прокрутки, чтобы указать эту полосу прокрутки, а не ScrollViewer
:
<RepeatButton
<!-- ... -->
CommandTarget="{Binding ElementName=myScrollBar}"/>
Наконец, вам необходимо подключить внешнюю полосу прокрутки к ScrollViewer
:
void MyScrollBar_OnScroll(object sender, ScrollEventArgs e)
{
ScrollBar sb = (ScrollBar)sender;
(sb.Tag as ScrollViewer)?.ScrollToHorizontalOffset(e.NewValue);
}
(Возможно, вы захотите сделать из этого Behavior
, чтобы оставить пустой код, избежать использования свойства Tag
и разрешить повторное использование).