我做过类似的事情,我发现最好的方法是将您的内容放在滚动查看器中,然后关闭滚动条。然后对按钮进行编码以滚动滚动查看器。
编辑:回应关于无法处理尺寸的评论。
首先,您可以将此控件构建为 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 的新值,以查看是否需要隐藏或显示任一按钮。
免责声明:此代码可能无法按原样工作,因为它是手工编写的,并且基于不同的示例。