移动和放大图像

时间:2013-08-28 10:09:58

标签: c# wpf

我有一个非常简单的要求(我想),一个在某个起点显示图像的窗口&大小并将其移动/缩放到某个终点和大小。这不是pan& zoom的典型图像查看器要求。更像是一个精灵动画。

我尝试了几种方法,例如一个ThicknessAnimation来改变边距来移动图像,但性能还不够好。我不得不承认我对WPF没有多少经验。

以下是我的最后一个版本,性能正常。图像元素遍历整个窗口,大小和位置由ScaleTransform和TranslateTransform设置。如果结束位置位于起始位置的右下方,例如,它可以很好地工作(并且显示相对平滑的运动)。从0,0到800,600。但是,如果是相反的情况,图像会在窗口的右下角进行弹弓移动,离开窗口然后最终返回到最终位置停止。

我很感激这种行为的解释以及解决方案。如果你知道一种不同的工作方式,并且性能相似或更好,我也想听听。

<Window x:Class="ViewBoxText.AnimatedImageWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="AnimatedImageWindow" 
    WindowStyle="None" 
    SizeToContent="WidthAndHeight" 
    AllowsTransparency="True" 
    ShowInTaskbar="False" 
    Left="0" 
    Top="0"
    Height="{Binding TotalHeight}" 
    Width="{Binding TotalWidth}"
    DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Grid>
    <Image x:Name="image" HorizontalAlignment="Left" VerticalAlignment="Top" Width="{Binding TotalWidth}" Height="{Binding TotalHeight}" Stretch="Uniform">
        <Image.RenderTransform>
            <TransformGroup>
                <TranslateTransform X="{Binding HorizontalStart}" Y="{Binding VerticalStart}" />
                <ScaleTransform />
            </TransformGroup>
        </Image.RenderTransform>
        <Image.Triggers>
            <EventTrigger RoutedEvent="Image.Loaded">
                <BeginStoryboard>
                    <Storyboard Completed="OnStoryBoardCompleted">
                        <DoubleAnimation Storyboard.TargetName="image" 
                                         Storyboard.TargetProperty="(Image.RenderTransform).(TransformGroup.Children)[1].(ScaleTransform.ScaleX)" 
                                         From="{Binding ScaleStart}" To="{Binding ScaleEnd}" DesiredFrameRate="30"
                                         Duration="0:0:2" BeginTime="0:0:0" />
                        <DoubleAnimation Storyboard.TargetName="image"
                                         Storyboard.TargetProperty="(Image.RenderTransform).(TransformGroup.Children)[1].(ScaleTransform.ScaleY)" 
                                         From="{Binding ScaleStart}" To="{Binding ScaleEnd}" DesiredFrameRate="30"
                                         Duration="0:0:2" BeginTime="0:0:0" />
                        <DoubleAnimation Storyboard.TargetName="image"
                                         Storyboard.TargetProperty="(Image.RenderTransform).(TransformGroup.Children)[0].(TranslateTransform.X)" 

                                         By="{Binding HorizontalOffset}"
                                         Duration="0:0:2" BeginTime="0:0:0" />
                        <DoubleAnimation Storyboard.TargetName="image"
                                         Storyboard.TargetProperty="(Image.RenderTransform).(TransformGroup.Children)[0].(TranslateTransform.Y)" 
                                         From="{Binding VerticalStart}" To="{Binding VerticalEnd}"
                                         Duration="0:0:2" BeginTime="0:0:0" />
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </Image.Triggers>   
    </Image>
</Grid>

1 个答案:

答案 0 :(得分:1)

问题是规模缩放约为0,0。我相信你想要扩展你感兴趣的点,这可能是也可能不是你的垂直/水平终点。

通常情况下,你会翻译,使得中心位于原点,比例尺上,然后将整个东西放回去。

e.g。关于点A,B

按比例缩放X.
  • 翻译-A,-B
  • 比例X
  • 翻译A,B

幸运的是,比例尺有几个中心属性,使这更容易。

因此,请尝试调整CenterX的{​​{1}}和CenterY属性。