1

我想在画布控件中缩放图像,保持画布中心为原点。最初我尝试使用渲染变换效果很好,但缩放后没有出现滚动条。我搜索了一下,发现布局变换应该用于该目的.我的问题是我现在在缩放后得到滚动条但缩放原点在画布的左上角,我怎样才能将它设置为中心。

 <ScrollViewer HorizontalScrollBarVisibility="Auto"  VerticalScrollBarVisibility="Auto">
        <Canvas x:Name="grdMain" RenderTransformOrigin="0.5,0.5">

            <Image  Source="{Binding BmpImageSource,UpdateSourceTrigger=PropertyChanged}" x:Name="TargetImage" >
            </Image>



           <!-- <Canvas.RenderTransform>
                <TransformGroup>
                    <ScaleTransform ScaleX="{Binding ScaleFactor}" ScaleY="{Binding ScaleFactor}" />
                </TransformGroup>
            </Canvas.RenderTransform>-->
            <Canvas.LayoutTransform>
                <TransformGroup>
                    <ScaleTransform ScaleX="{Binding ScaleFactor}" ScaleY="{Binding ScaleFactor}" />
                </TransformGroup>
            </Canvas.LayoutTransform>



        </Canvas>
    </ScrollViewer>

一些建议说要在布局变换上设置 centerX 和 centerY,但我的应用程序的大小是动态的,我可能不固定中心点。

 <ScaleTransform ScaleX="{Binding ScaleFactor}" ScaleY="{Binding ScaleFactor}"  
         CenterX="250" CenterY="250"/>
4

1 回答 1

0

一些建议说要在布局变换上设置 centerX 和 centerY,但我的应用程序的大小是动态的,我可能不固定中心点。

然后您需要动态计算CenterXCenterY属性的值。使用LayoutTransform.

例如,您可以处理的Loaded事件以编程Canvas方式应用:LayoutTransform

<Canvas x:Name="grdMain" Loaded="grdMain_Loaded">...

private void grdMain_Loaded(object sender, RoutedEventArgs e)
{
    Canvas canvas = sender as Canvas;
    ScaleTransform st = new ScaleTransform();
    BindingOperations.SetBinding(st, ScaleTransform.ScaleXProperty, new Binding("ScaleFactor"));
    BindingOperations.SetBinding(st, ScaleTransform.ScaleYProperty, new Binding("ScaleFactor"));
    st.CenterX = canvas.ActualWidth / 2;
    st.CenterY = canvas.ActualHeight / 2;
    canvas.LayoutTransform = st;
}
于 2017-04-18T10:18:45.597 回答