带扩展器的ScrollViewer

本文关键字:ScrollViewer 扩展器 | 更新日期: 2023-09-27 18:17:04

我在我的Silverlight项目中有一个ScrollViewer,它包含有内容的扩展器。VerticalScrollBarVisibility设置为Auto和HorizontalScrollBarVisibility设置为Disabled,因为不需要。问题是,当我展开一个或多个展开器,使垂直滚动条可见时,它将展开器内的内容略微向左推。我怎么能做到这一点,当(垂直)滚动条出现,它不推动展开器/内容到左边?

我不能上传图片,所以上传扩展的例子到TinyPic:

http://i42.tinypic.com/xvamd.png

示例代码可在http://pastebin.com/khPR8nPF

谢谢!

带扩展器的ScrollViewer

你可以这样做:

<ScrollViewer Name="scrollViewer1"
              Grid.Row="1"
              Grid.ColumnSpan="2"
              VerticalAlignment="Stretch"
              VerticalContentAlignment="Stretch"
              BorderBrush="{x:Null}"
              VerticalScrollBarVisibility="Auto">
  <!-- New Bit -->
  <ScrollViewer.Style>
    <Style TargetType="{x:Type ScrollViewer}">
      <Style.Resources>
        <Thickness x:Key="InvisScrollBarDimension"
                    Bottom="0"
                    Left="0"
                    Right="{StaticResource {x:Static SystemParameters.VerticalScrollBarWidthKey}}"
                    Top="0" />
      </Style.Resources>
      <Setter Property="Margin"
              Value="{StaticResource InvisScrollBarDimension}" />
      <Style.Triggers>
        <Trigger Property="ComputedVerticalScrollBarVisibility"
                  Value="Visible">
          <Setter Property="Margin"
                  Value="0" />
        </Trigger>
      </Style.Triggers>
    </Style>
  </ScrollViewer.Style>
  ...

概念是当Scrollbar不可见时,基于系统参数VerticalScrollBarWidthKeyScrollViewer一个正确的Margin, ComputedVerticalScrollBarVisibilityTrigger帮助我们确定并在Scrollbar可见时将其重置为0。

这会在运行时产生无抖动效果。