Я делаю своего рода управление "предварительным просмотром" для некоторых документов в моем приложении Silverlight 3. У меня есть Холст (для предъявления документа) в ScrollViewer, и у меня есть увеличение / уменьшение кнопок, которые управляют свойствами X and Y Scale ScaleTransform для Холста. Свойство RenderTransform. Я хочу, чтобы полосы прокрутки 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>
Вы заметите, что я поместил
между
и
и событие щелчка ScaleRect
в
.
Подложка ScaleRect
просто масштабирует прямоугольник на 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