Pergunta

Estou fazendo uma espécie de controle de "visualização de impressão" para alguns documentos no meu aplicativo Silverlight 3. Eu tenho uma tela (para mostrar o documento) dentro de um scrollViewer, e tenho o zoom em / zoom out botões que controlam as propriedades de escala X e Y do Scaletransform para a propriedade Canvas.rendertransform. Eu quero que as barras de rolagem do ScrollViewer apareçam quando eu "zoom em" o suficiente para que a tela não seja mais visível na área do scrollViewer, mas parece que eles só aparecem dependendo da largura/altura da própria tela, independentemente se é ampliado ou não.

Alguém pode ajudar?

Foi útil?

Solução

Sim, o problema é que não há LayoutTransform em Silverlight. Existem algumas soluções alternativas para este problema listado aqui.

A idéia aqui é fornecer uma tela intermediária que é redimensionada e, como resultado, redimensiona a área rolável. Por exemplo, se eu tiver o seguinte 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>

Você notará que eu coloquei o <Canvas x:Name="sizer"/> Entre o <ScrollViewer/> e <Rectangle/> e o evento de clique de ScaleRect no <Button/>.

o ScaleRect sub simplesmente escala o retângulo por 2. Esse valor é então usado para alterar o sizer Width e Height, atualizando assim as barras de rolagem do ScrollViewer. Aqui está o sub 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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top