Windows Phone XAML: применение матрицы преобразования после жеста сжатия

Я перемещаю и масштабирую прямоугольник внутри элемента холста с помощью сенсорных жестов. Код основан на этой ссылке: http://msdn.microsoft.com/en-us/magazine/gg650664.aspx

Код XAML выглядит следующим образом:

<Canvas Name="canvas" >
    <Rectangle x:Name="rectangle" Fill="Green"  Height="300" Canvas.Left="0" Stroke="Red" Canvas.Top="0" Width="100" StrokeThickness="3" >
        <Rectangle.RenderTransform>
            <TransformGroup>
                <MatrixTransform x:Name="previousTransform" />

                <TransformGroup x:Name="currentTransform">
                    <ScaleTransform x:Name="scaleTransform" />
                    <TranslateTransform x:Name="translateTransform" />
                </TransformGroup>
            </TransformGroup>
        </Rectangle.RenderTransform>

        <toolkit:GestureService.GestureListener>
            <toolkit:GestureListener DragStarted="OnGestureListenerDragStarted"
                             DragDelta="OnGestureListenerDragDelta"
                             DragCompleted="OnGestureListenerDragCompleted"
                             PinchStarted="OnGestureListenerPinchStarted"
                             PinchDelta="OnGestureListenerPinchDelta"
                             PinchCompleted="OnGestureListenerPinchCompleted" />
        </toolkit:GestureService.GestureListener>
    </Rectangle>
</Canvas>

Перетаскивание:

void OnGestureListenerDragDelta(object sender, DragDeltaGestureEventArgs args)
{
    translateTransform.X += args.HorizontalChange;
    translateTransform.Y += args.VerticalChange;
}

Во время сжатия масштабное преобразование обновляется:

void OnGestureListenerPinchDelta(object sender, PinchGestureEventArgs args)
{
    scaleTransform.ScaleX = args.DistanceRatio;
    scaleTransform.ScaleY = args.DistanceRatio;
}

Когда сжатие завершится, я хочу получить «реальный» размер и положение прямоугольника на родительском холсте. Поэтому я попытался применить преобразование к границам прямоугольника:

void OnGestureListenerPinchCompleted(object sender, PinchGestureEventArgs args)
{
    Rect r = currentTransform.TransformBounds(new Rect(Canvas.GetLeft(rectangle), Canvas.GetTop(rectangle), rectangle.Width, rectangle.Height));
    rectangle.Width = r.Width;
    rectangle.Height = r.Height;
    Canvas.SetLeft(rectangle, r.X);
    Canvas.SetTop(rectangle, r.Y);

    // Reset transforms
    previousTransform.Matrix = new Matrix();
    rectangle.RenderTransformOrigin = new Point(0, 0);

    scaleTransform.ScaleX = scaleTransform.ScaleY = 1;
    scaleTransform.CenterX = scaleTransform.CenterY = 0;

    translateTransform.X = translateTransform.Y = 0;
}

Это отлично работает для перевода, но масштабирование неправильное (прямоугольник масштабируется, но коэффициент слишком велик при увеличении масштаба и слишком мал при его уменьшении). Как я могу получить правильный окончательный размер масштабированного прямоугольника?

С Уважением


person Hyndrix    schedule 13.06.2014    source источник


Ответы (1)


Я исправил проблему, пропустив классы матрицы преобразования и используя коэффициент масштабирования и значения перевода вручную.

Тем не менее мне было бы интересно найти решение для использования приведенного выше кода XAML.

person Hyndrix    schedule 13.06.2014