6

Silverlight 3 アプリケーションで、いくつかのドキュメントの一種の「印刷プレビュー」コントロールを作成しています。ScrollViewer 内に Canvas (ドキュメントを表示するため) があり、Canvas.RenderTransform プロパティの ScaleTransform の X および Y Scale プロパティを制御するズームイン/ズームアウト ボタンがあります。ScrollViewer 領域にキャンバスが表示されなくなるほど十分に「ズームイン」すると、ScrollViewer のスクロールバーが表示されるようにしたいのですが、キャンバス自体の幅/高さに応じてのみ表示されるようです。ズームインしているかどうか。

誰でも助けることができますか?

4

1 に答える 1

9

ええ、問題はLayoutTransformSilverlight にないことです。ここにリストされているこの問題の回避策がいくつかあります。

ここでのアイデアは、サイズが変更され、その結果、スクロール可能な領域のサイズが変更される中間キャンバスを提供することです。たとえば、次の 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単純に四角形を 2 倍にスケーリングします。その値を使用して と を変更しsizer WidthHeightScrollViewer のスクロールバーを更新します。のサブは次の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
于 2010-03-09T06:14:20.123 に答える