5

Silverlight アプリケーションの一部として ScrollViewer を使用しています。横向きで、スクロールボタンのみが表示され、スクロールバー自体は表示されないようにしたいと思います。この大まかな ASCII レンダリングのようなもの:

------------------------------------------------------
|   |                                            |   |
| < |                Content Here                | > |
|   |                                            |   |
------------------------------------------------------

テンプレート機能を使用できることはわかっていますが、私が見たすべてのサンプルは、すべての要素の外観を変更するだけで、生の配置や表示されるかどうかは変更しません。これを行うことは可能ですか?テンプレートがどのように見えるかの概要を誰かが提供できますか?

4

4 に答える 4

2

ここに別のオプションがあります。SCrollviewer のデフォルト テンプレートをオーバーライドし、ボタンを PageUp/PageDown として処理します。以下の私の例は、垂直方向にスクロールするスクロールビューアです。水平スクロールに簡単に変更し、ハンドラーを PageUp/PageDown から Left および Right ハンドラーに変更できます。

<ControlTemplate TargetType="{x:Type ScrollViewer}" x:Key="ButtonOnlyScrollViewer">
        <ControlTemplate.Resources>
            <!-- Add style here for repeat button seen below -->
        </ControlTemplate.Resources>
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="*"/>
                <RowDefinition Height="Auto"/>
            </Grid.RowDefinitions>

            <RepeatButton Grid.Row="0"
                          Foreground="White" 
                          Background="Yellow" 
                          HorizontalAlignment="Stretch" 
                          Command="ScrollBar.PageUpCommand"
                          Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}">
            </RepeatButton>

            <ScrollContentPresenter
                CanContentScroll="{TemplateBinding CanContentScroll}"
                Grid.Row="1" 
                Content="{TemplateBinding Content}"  
                Width="{TemplateBinding Width}"
                Height="{TemplateBinding Height}" 
                Margin="{TemplateBinding Margin}"/>

            <RepeatButton Grid.Row="2" Background="Black" Foreground="White" Command="ScrollBar.PageDownCommand">
            </RepeatButton>
        </Grid>
    </ControlTemplate>
于 2008-12-17T23:37:31.230 に答える
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>

次に、コントロールで 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) Horizo​​ntalOffset の新しい値をチェックして、いずれかのボタンを表示または非表示にする必要があるかどうかを確認する必要があります。

免責事項: このコードは、別の例に基づいて手作業で作成されているため、そのままでは機能しない可能性があります。

于 2008-12-17T19:47:44.500 に答える
1

ここで解決策を見つけました:)

http://weblogs.asp.net/fredriknormen/archive/2009/09/18/create-an-automatic-scrollable-image-slider-in-silverlight.aspx

これは DispatcherTimer を使用して作成されたもので、本当に良い例です:)

于 2010-08-20T20:08:53.827 に答える