XAML: Fare uno ScrollViewer mostrare le barre di scorrimento quando la ScaleTransform di un oggetto figlio diventa grande

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

Domanda

sto facendo una sorta di controllo "anteprima di stampa" per alcuni documenti in mia applicazione Silverlight 3. Ho una tela (per mostrare il documento) all'interno di uno ScrollViewer, e ho ingrandimento / rimpicciolimento pulsanti che controllano le proprietà Y scala del ScaleTransform per la proprietà Canvas.RenderTransform X e. Voglio che le barre di scorrimento del ScrollViewer per mostrare quando ho "Zoom in" abbastanza in modo che la tela non è più visibile nell'area di ScrollViewer è, ma sembra che essi mostrano solo fino a seconda della larghezza / altezza della tela stessa, a prescindere dal fatto che è ingrandita o meno.

Chiunque può aiutare?

È stato utile?

Soluzione

Sì, il problema è che non v'è alcun LayoutTransform in Silverlight. Ci sono alcune soluzioni a questo problema elencato qui .

L'idea è quella di fornire una tela intermedia che viene ridimensionato e, di conseguenza, ridimensiona l'area scorrevole. Per esempio, se ho il seguente 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>

Si noterà che ho messo il <Canvas x:Name="sizer"/> tra il <ScrollViewer/> e <Rectangle/> e l'evento click del ScaleRect nel <Button/>.

Il sub ScaleRect scale semplicemente il rettangolo 2. Tale valore viene quindi utilizzato per cambiare il sizer Width e Height, aggiornando così le barre di scorrimento del ScrollViewer. Ecco il sub per 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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top