XAML:当子对象的ScaleTransform变大时,让ScrollViewer显示滚动条

时间:2010-03-06 22:51:21

标签: silverlight xaml silverlight-3.0 scrollviewer scaletransform

我正在为Silverlight 3应用程序中的某些文档进行一种“打印预览”控件。我在ScrollViewer中有一个Canvas(用于显示文档),我有放大/缩小按钮,用于控制Canvas.RenderTransform属性的ScaleTransform的X和Y Scale属性。我希望ScrollViewer的滚动条在我“放大”时显示,以便画布在ScrollViewer区域中不再可见,但似乎它们只显示取决于画布本身的宽度/高度,无论如何是否放大。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:9)

是的,问题是Silverlight中没有LayoutTransform。列出here列出的问题有一些解决方法。

这里的想法是提供一个调整大小的中间画布,从而调整可滚动区域的大小。例如,如果我有以下XAML:

<Grid x:Name="LayoutRoot">
    <Grid.RowDefinitions>
        <RowDefinition Height="200" />
        <RowDefinition Height="25" />
    </Grid.RowDefinitions>
        <ScrollViewer Grid.Row="0" x:Name="sc" VerticalScrollBarVisibility="Auto" 
                      HorizontalScrollBarVisibility="Auto" Width="200" Height="200" >
        <Canvas x:Name="sizer" Width="200" Height="200">
            <Rectangle x:Name="gradientRect" Width="200" Height="200">
            <Rectangle.RenderTransform>
                <ScaleTransform ScaleX="1" ScaleY="1"/>
            </Rectangle.RenderTransform>
                <Rectangle.Fill>
                    <LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
                        <GradientStop Color="Red" Offset="0.1"/>
                        <GradientStop Color="Yellow" Offset="0.5"/>
                        <GradientStop Color="Red" Offset="0.9"/>
                    </LinearGradientBrush>
                </Rectangle.Fill>
            </Rectangle>
        </Canvas>
    </ScrollViewer>
    <Button Grid.Row="1" Content="Multiply by Two" Click="ScaleRect" Width="100" Height="25"></Button>
</Grid>

您会注意到我将<Canvas x:Name="sizer"/>放在<ScrollViewer/><Rectangle/>之间以及ScaleRect中的<Button/>点击事件。

ScaleRect sub只是将矩形缩放2.然后,该值用于更改sizer WidthHeight,从而更新ScrollViewer的滚动条。这是ScaleRect的子项:

Private Sub ScaleRect(ByVal sender As Object, ByVal e As RoutedEventArgs)
    Dim zoom As Double = 2.0
    Dim scaleX = gradientRect.RenderTransform.GetValue(ScaleTransform.ScaleXProperty)
    Dim scaleY = gradientRect.RenderTransform.GetValue(ScaleTransform.ScaleYProperty)
    gradientRect.RenderTransform.SetValue(ScaleTransform.ScaleXProperty, scaleX * zoom)
    gradientRect.RenderTransform.SetValue(ScaleTransform.ScaleYProperty, scaleY * zoom)
    sizer.Height *= zoom
    sizer.Width *= zoom
End Sub