XAML:子オブジェクトのScaleTransformが大きなを取得するときにScrollViewerのショーのスクロールバーを作ります

StackOverflow https://stackoverflow.com/questions/2394370

質問

私は自分のSilverlight 3アプリケーション内のいくつかの文書のための「印刷プレビュー」コントロールのようなものを作っています。私は(文書を示す)キャンバスScrollViewerの内部を有し、制御Canvas.RenderTransformプロパティのScaleTransformのXとYスケール特性をことを私は、ズームイン/ズームボタンを有しています。かかわらず、私はキャンバスがScrollViewerの領域にもはや目に見えるように十分「ズームイン」ときScrollViewerののスクロールバーを表示したいが、彼らが唯一のキャンバス自体の幅/高さに応じて現れているようですかどうか、それがでたりないズームされます。

缶誰ヘルプ?

役に立ちましたか?

解決

うん、問題は、SilverlightにはLayoutTransformがないことです。 ここに記載されている。この問題にはいくつかの回避策があります。

ここでのアイデアは、サイズ変更し、その結果として、スクロール可能な領域のサイズを変更します中間キャンバスを提供することです。例えば、私は、次の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サブ単に値は、次にこのようScrollViewerののスクロールバーを更新し、sizerWidthHeightを変更するために使用される2によって矩形をスケーリングします。ここで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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top