2015-12-08 2 views
0

Я хочу сделать Touch-Viewer, где я хочу увеличить размер пальца.Pinch-Zoom: получить касание по отношению к объекту

У меня есть ViewBox с контент-предъявитель внутри сетки:

<Grid IsManipulationEnabled="True"> 
    <Viewbox x:Name="PART_Viewbox"> 
     /// Content 
    </Viewbox> 
</Grid> 

Крупнее с ScrollWheel моей мыши в точку, где мышь, я решил в течение следующих методов:

var position = e.GetPosition(PART_Viewbox); 
matrix.ScaleAtPrepend(scale, scale, position.X, position.Y); 

метод e.GetPosition IST доступны только в MouseEventsArgs, а не в ManipulationDeltaEventArgs.

Так как я могу получить относительное положение в сенсорном режиме?

Когда я взять e.ManipulationOrigin из ManipulationDeltaEventArgs и сетки больше, то Viewbox он переводит содержание ViewBox где-то еще в то время как масштабирование или наружу.

Большинство примеров, показывающих масштабирование в середине содержимого (изображения). Это не то, что я хочу.

ответ

1

Класс FrameworkElement происходит от UIElement. Существует метод TranslatePoint, который переводит точку относительно элемента.

В ManipulationDeltaEventArgs это свойство ManipulationOrigin, которая представляет собой точку между двумя пальцами в крайнем случае увеличения. Другим важным свойством является ManipulationContainer, который содержит элемент, на котором выполняется манипуляция.

Так что в моем случае я могу сделать следующее:

// Typecast ManipulationContainer to FrameworkElement and get point around the finger 
Point position =((FrameworkElement)e.ManipulationContainer) 
.TranslatePoint(e.ManipulationOrigin, _Viewbox); 

// Center the new point in account to previous manipulations 
position = matrix.Transform(position); 

// do the transformation 
matrix.ScaleAt(deltaManipulation.Scale.X, deltaManipulation.Scale.Y, position.X, position.Y) 

Я нашел эту подсказку в исходном https://multitouchtransformbehavior.codeplex.com/

Смежные вопросы