如何在图像缩放后更新scrollviewer?

时间:2014-01-09 18:04:36

标签: c# wpf image scale scrollviewer

我在缩放图片后更新了ScrollViewer中的一个大问题。我试过调用方法UpdateLayout,但一切都完好无损。图像没有缩放问题,但滚动条保持不变。

几个小时后,我在堆栈溢出和谷歌上寻找不同的解决方案,但没有我失败。 XAML:

        <ScrollViewer x:Name="imagescrl" Grid.Row="1" VerticalScrollBarVisibility="Auto" CanContentScroll="True" HorizontalScrollBarVisibility="Auto" >
            <Image x:Name="imgp"  VerticalAlignment="Center" HorizontalAlignment="Center">
                <Image.RenderTransform>
                    <TransformGroup>
                        <ScaleTransform ScaleX="0.01" ScaleY="0.01"/>
                        <ScaleTransform x:Name="imgpScale">
                            <ScaleTransform.ScaleX>
                                <Binding ElementName="sldZoom" Path="Value" Mode="OneWay"/>
                            </ScaleTransform.ScaleX>
                            <ScaleTransform.ScaleY>
                                <Binding ElementName="sldZoom" Path="Value" Mode="OneWay"/>
                            </ScaleTransform.ScaleY>
                        </ScaleTransform>
                    </TransformGroup>
                </Image.RenderTransform>
            </Image>
        </ScrollViewer>
    ...
    ...


            <Slider ValueChanged="Slider_ValueChanged"  x:Name="sldZoom"   BorderThickness="11,20,0,5" Maximum="250" Minimum="1" Value="100" Width="153"/>

谢谢

C#:

private void Slider_ValueChanged(object sender,RoutedPropertyChangedEventArgs<double> e)
    {
        imagescrl.UpdateLayout();
    }

2 个答案:

答案 0 :(得分:5)

你需要使用

<Image.LayoutTransform> 

而不是

<Image.RenderTransform>

并且不需要backendcode中的事件

答案 1 :(得分:3)

Jim's answer应该是正确的,但要解释原因:

WPF中的

RenderTransform仅影响屏幕上像素的最终渲染。它不会影响WPF认为的大小 - 如果你将变换渲染到50%,然后问它的大小是什么,它会认为它的大小相同。这意味着您放入的任何面板/滚动查看器也会认为它是原始尺寸。

LayoutTransform会影响对象的实际大小,因此如果你使用LayoutTransform,它会改变它的大小属性,因此滚动查看器应该可以工作

为什么有2种变换?有时您只想影响渲染输出而不更改布局,并且因为RenderTransform不会更改布局,所以它应该更快,因为没有父视图需要重新计算它们的大小等等