私は似たようなことをしましたが、これを行うための最良の方法は、コンテンツをスクロール ビューアーに配置し、スクロールバーをオフにすることでした。次に、スクロールビューアをスクロールするボタンをコーディングします。
編集:サイジングに対処する方法がないというコメントへの対応。
まず、このコントロールを 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 の新しい値をチェックして、いずれかのボタンを表示または非表示にする必要があるかどうかを確認する必要があります。
免責事項: このコードは、別の例に基づいて手作業で作成されているため、そのままでは機能しない可能性があります。