只有按钮的Silverlight Scrollviewer

Nic*_*ick 5 silverlight scrollviewer

我使用ScrollViewer作为Silverlight应用程序的一部分.它有一个水平方向,我希望它看起来只有滚动按钮​​出现,而不是滚动条本身.像这样粗糙的ASCII渲染:

------------------------------------------------------
|   |                                            |   |
| < |                Content Here                | > |
|   |                                            |   |
------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用模板功能,但我看到的所有样本只会改变所有元素的外观,而不是它们的原始定位,或者它们是否出现.是否可以这样做,有人可以提供模板外观的大纲吗?

Bry*_*ant 1

我做过类似的事情,我发现最好的方法是将您的内容放入滚动查看器中,然后关闭滚动条。然后对按钮进行编码以滚动滚动查看器。

编辑:回应关于无法处理尺寸的评论。

首先,您可以将此控件构建为 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>
Run Code Online (Sandbox Code Playgroud)

然后在您的控件中您需要重写 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;
}
Run Code Online (Sandbox Code Playgroud)

在按钮单击处理程序中,您需要 (1) 滚动查看器并 (2) 检查 Horizo​​ntalOffset 的新值以查看是否需要隐藏或显示任一按钮。

免责声明:此代码可能无法按原样工作,因为它是手工编写的并且基于不同的示例。