Я сделал что-то похожее, и лучший способ найти это - поместить свой контент в средство просмотра прокрутки и просто отключить полосы прокрутки. Затем используйте ваши кнопки для прокрутки прокрутки.
Редактировать: Ответ на комментарий о том, как не справиться с калибровкой.
Во-первых, вы должны создать этот элемент управления как ContentControl. Он должен иметь шаблон, определенный в generic.xaml, в котором есть ваши элементы управления кнопками и просмотрщик прокрутки. Что-то вроде:
<Canvas x:Name="root">
<Button x:Name="left" Content="<"/>
<Button x:Name="right" Content=">"/>
<ScrollViewer x:Name="viewer" BorderThickness="0" VerticalScrollBarVisibility="Hidden">
<ContentPresenter />
</ScrollViewer>
</Canvas>
Тогда в вашем контроле вам нужно переопределить OnApplyTemplate:
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
left = GetTemplateChild("left") as Button;
left.Click += new RoutedEvent(YourHandler);
right = GetTemplateChild("right") as Button;
right.Click += new RoutedEvent(YourHandler);
// position your scroll buttons here, not writing that code
scroll = GetTemplateChild("viewer") as ScrollViewer;
root = GetTemplateChild("root") as Canvas;
var fe = this.Content as FrameworkElement;
if (fe != null)
{
fe.SizeChanged += new SizeChangedEventHandler(fe_SizeChanged);
}
}
void fe_SizeChanged(object sender, SizeChangedEventArgs e)
{
this.InvalidateMeasure();
}
protected override Size ArrangeOverride(Size finalSize)
{
if (!double.IsInfinity(scroll.ViewportHeight))
{
left.Visibility = (scroll.HorizontalOffset > 0);
right.Visibility = (scroll.HorizontalOffset < ScrollableHeight);
}
return base.ArrangeOverride(finalSize);
}
protected override Size MeasureOverride(Size availableSize)
{
scroll.Measure(availableSize);
return scroll.DesiredSize;
}
В обработчиках щелчков по кнопкам вам необходимо (1) прокрутить средство просмотра и (2) проверить новое значение HorizontalOffset, чтобы увидеть, нужно ли вам скрыть или показать любую из кнопок.
Отказ от ответственности: этот код, вероятно, не работает как есть, поскольку он был написан от руки и основан на другом примере.