XAML: Сделайте ScrollViewer Show Scrollbards, когда Scaletransform от дочернего объекта становится большой

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

Вопрос

Я делаю своего рода «печать предварительного просмотра» для некоторых документов в моем приложении Silverlight 3. У меня есть холст (для определения документа) внутри ScrollViewer, и у меня есть кнопки ZOOM In / Zoom out, которые управляют свойствами масштаба X и Y ScaleTransform для свойства Canvas.renderTransform. Я хочу, чтобы полосы прокрутки ScrollViewer появляются, когда я «масштабирую» достаточно, чтобы холст больше не виден в зоне ScrollViewer, но кажется, что они только появляются в зависимости от ширины / высоты самого холста, независимо от о том, увеличивается ли он в или нет.

Может кто-нибудь помочь?

Это было полезно?

Решение

Да, проблема в том, что нет LayoutTransform в Silverlight. Есть некоторые обходные пути к этой проблеме здесь.

Идея здесь состоит в том, чтобы обеспечить промежуточный холст, который получает изменение, и в результате изменяется изменение прокручиваемой области. Например, если у меня есть следующий 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 Width а также Height, Таким образом, обновление прокрутки прокрутки 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top