image - 如何不将图像拖出框架?

标签 image windows-phone-7

我找不到我需要的属性或对象..

我已经实现了可拖动和可缩放的图像,但我可以将其拖出屏幕,因此我将图像从 View 中丢失了。

我应该把图像放在哪里才能将其保存在盒子内(并且可能具有良好的弹跳效果)?

编辑:

实际上,我的图像必须保留在堆栈面板中,只能放大。 (最大缩小作为第一个渲染)。

一些代码:

    private void OnPinchStarted(object sender, PinchStartedGestureEventArgs e)
    {
        initialAngle = compositeTransform.Rotation;
        initialScale = compositeTransform.ScaleX;
    }

    private void OnPinchDelta(object sender, PinchGestureEventArgs e)
    {
        compositeTransform.ScaleX = initialScale * e.DistanceRatio;
        compositeTransform.ScaleY = initialScale * e.DistanceRatio;
    }

    private void OnDragDelta(object sender, DragDeltaGestureEventArgs e)
    {
        compositeTransform.TranslateX += e.HorizontalChange;
        compositeTransform.TranslateY += e.VerticalChange;
    }

    <StackPanel x:Name="container">
        <Image x:Name="image_chart">
            <Image.RenderTransform>
                <TransformGroup>
                    <ScaleTransform x:Name="scale" />
                    <TranslateTransform x:Name="transform" />
                    <CompositeTransform x:Name="compositeTransform"/>
                </TransformGroup>
            </Image.RenderTransform>
            <toolkit:GestureService.GestureListener>
                <toolkit:GestureListener PinchStarted="OnPinchStarted" PinchDelta="OnPinchDelta"
                                         DragDelta="OnDragDelta"/>
            </toolkit:GestureService.GestureListener>
        </Image>
    </StackPanel>

编辑 2 - 半答案

我终于找到了如何停止缩小到原始尺寸!

private void OnPinchDelta(object sender, PinchGestureEventArgs e)
    {
        if (1.0 <= (initialScale * e.DistanceRatio))
        {
            compositeTransform.ScaleX = initialScale * e.DistanceRatio;
            compositeTransform.ScaleY = initialScale * e.DistanceRatio;
        }
    }

If 条件意味着:如果我放大 -> 没问题,因为 e.DistanceRatio >1。如果我缩小,我会停下来,直到初始比例相同!

现在我仍然需要有关如何避免外面的阻力的帮助。

最佳答案

好的,我找到了解决方案,但我需要一些改进。 缩放工作正常,但是当图像位于右侧时,它全部位于左侧(因为它是从左上角开始缩放的..

这是“阻止拖动”的代码:

private void OnDragDelta(object sender, DragDeltaGestureEventArgs e)
    {

        double realWidth = image_chart.ActualWidth*compositeTransform.ScaleX;
        double realHeight = image_chart.ActualHeight * compositeTransform.ScaleY;

        if(compositeTransform.TranslateX>=0)
           compositeTransform.TranslateX = Math.Max(container.ActualWidth - realWidth,
                                                 Math.Min(0, compositeTransform.TranslateX + e.HorizontalChange));
        else
            compositeTransform.TranslateX = Math.Max(container.ActualWidth - realWidth,
                                                     Math.Min(0, compositeTransform.TranslateX + e.HorizontalChange));
        if(compositeTransform.TranslateY>=0)
           compositeTransform.TranslateY = Math.Max(container.ActualHeight - realHeight,
                                                 Math.Min(0, compositeTransform.TranslateY + e.VerticalChange));
        else
            compositeTransform.TranslateY = Math.Max(container.ActualHeight - realHeight,
                                                     Math.Min(0, compositeTransform.TranslateY + e.VerticalChange));

编辑:

最后我决定使用网络浏览器..更加“流畅”和令人愉快!

关于image - 如何不将图像拖出框架?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10616816/

相关文章:

javascript - Ruby on Rails,使用 JavaScript 更改图像源

android - HTML5 与 native 应用程序 : Which to choose ? ?

windows-phone-7 - 可本地化的推送通知

asp.net - 使用 itext (itextsharp) 替换一个 PDF 模板页面上的多个不同图像

html - 如何使用Base64编码图片作为img标签的来源?

windows-phone-7 - 防止 Windows Phone 中的枢轴导航

windows-phone-7 - WP7中的Enum.GetValues

c# - 检查夏令时是否有效?

html - 有图案的图片有时会显示奇怪

android - 如何使用计时器更改图像