Соотношение сторон изменяется при прокрутке увеличенного изображения в Wp7

#c# #silverlight #windows-phone-7 #gesture

#c# #silverlight #windows-phone-7 #жест

Вопрос:

У меня есть изображение в scrollviewer.На изображении реализована функция ввода и вывода. Но при прокрутке увеличенного изображения соотношение сторон изменяется, и изображения искажаются. Следуя xaml:

  <ScrollViewer HorizontalScrollBarVisibility="Auto"  VerticalScrollBarVisibility="Auto" Name="scroller" >
            <Image  Name="image_new"   Visibility="Visible"    CacheMode="BitmapCache"   >
                <Image.RenderTransform >
                <CompositeTransform x:Name="transform"/>
                </Image.RenderTransform >
                <toolkit:GestureService.GestureListener>
                    <toolkit:GestureListener  Flick="OnFlick" PinchStarted="OnPinchStarted" PinchDelta="OnPinchDelta"  DoubleTap="Onimage_doubletap" Tap="Onimage_singletap" />

                </toolkit:GestureService.GestureListener>

            </Image>
        </ScrollViewer>
  

А в файле .cs методы следующие :

   private void OnPinchStarted(object sender, PinchStartedGestureEventArgs e)
    {

        Point point0 = e.GetPosition(image_new, 0);
        Point point1 = e.GetPosition(image_new, 1);
        Point midpoint = new Point((point0.X   point1.X) / 2, (point0.Y   point1.Y) / 2);
        image_new.RenderTransformOrigin = new Point(midpoint.X / image_new.ActualWidth, midpoint.Y / image_new.ActualHeight);
        initialScale = transform.ScaleX;

    }

    private void OnPinchDelta(object sender, PinchGestureEventArgs e)
    {

        transform.ScaleX = Math.Max(Math.Min(initialScale * e.DistanceRatio, 3.0), 0.5);
        transform.ScaleY = Math.Max(Math.Min(initialScale * e.DistanceRatio, 3.0), 0.5);

    }
  

Ответ №1:

Я думаю, проблема здесь в том, что вы меняете RenderTransformOrigin для каждого жеста ущипывания, что приводит к искажению. Я бы попробовал оставить RenderTransformOrigin фиксированным на 0,5, 0,5, чтобы гарантировать, что вы получите равномерный масштаб.

Я предполагаю, что вы перемещали начало координат, чтобы попытаться увеличить / уменьшить часть изображения, на которой пользователь запустил жест. Для достижения этого, я думаю, вам нужно будет разрешить пользователю перемещаться по изображению после увеличения.

Еще один момент, масштабный коэффициент всегда одинаков, поэтому вы должны просто вычислить его один раз, а затем присвоить его как scaleX, так и scaleY.

Комментарии:

1. Спасибо за ответ… Для панорамирования я использовал средство просмотра прокрутки, чтобы пользователь мог прокручивать изображение по горизонтали или вертикали для панорамирования. Но при панорамировании изображение искажается. Я исправил значение RenderTransformOrigin на 0.5, 0.5 но проблема по-прежнему сохраняется.

2. Хм… интересно. Если вы можете опубликовать проект или простое воспроизведение где-нибудь, я могу взглянуть более подробно.