Hej Я играю с приложением для телефона с телефоном 8, используя MVVM.ViewportControl Pinch zoom center
У меня возникла проблема с приобретением центра масштабирования и полным пониманием границ на контроллере viewportcontroller. И, наконец, переконфигурирование диспетчера viewport для прокрутки всего изображения. Мой XAML код:
<Grid>
<StackPanel>
<ViewportControl Bounds="0,0,1271,1381.5" Height="480" Width="800" CacheMode="BitmapCache" RenderTransformOrigin="{Binding KontaktPunkter}" Canvas.ZIndex="1">
<ViewportControl.RenderTransform>
<CompositeTransform x:Name="myTransform" ScaleX="1" ScaleY="1" TranslateX="0" TranslateY="0" />
</ViewportControl.RenderTransform>
<View:Picture/>
</ViewportControl>
</StackPanel>
<View:PopUpUC DataContext="{Binding PopUp}"/>
</Grid>
Насколько я понимаю Bounds это область, которую я хочу, чтобы иметь возможность прокрутки, а высота и ширина размер окна управления является ли это правильно?
Да, это правильно.
На вторую часть :) Получение центра движения зума с увеличением.
public void ZoomDelta(ManipulationDeltaEventArgs e)
{
FrameworkElement Element = (FrameworkElement)e.OriginalSource;
ViewportControl Picture;
Grid PictureGrid;
double MainWidth = Application.Current.RootVisual.RenderSize.Height;
double MainHeight = Application.Current.RootVisual.RenderSize.Width;
if (Element is ViewportControl)
{
Picture = Element as ViewportControl;
}
else
{
Picture = FindParentOfType<ViewportControl>(Element);
}
if (Element is Grid)
{
PictueGrid = Element as Grid;
}
else
{
PictureGrid = FindParentOfType<Grid>(Element);
}
Grid ScreenGrid = FindParentOfType<Grid>(PictureGrid);
if (e.PinchManipulation != null)
{
var newScale = e.PinchManipulation.DeltaScale * Map.previousScale;
if (!IsZooming)
{
Point FingerOne = e.PinchManipulation.Current.PrimaryContact;
Point FingerTwo = e.PinchManipulation.Current.SecondaryContact;
Point center = new Point((FingerOne.X + FingerTwo.X)/2, (FingerOne.Y + FingerTwo.Y)/2);
KontaktPunkter = new Point(center.X/Picture.Bounds.Width, center.Y/Picture.Bounds.Height);
IsZooming = true;
}
var newscale = Map.imageScale * newScale;
var transform = (CompositeTransform)Picture.RenderTransform;
if (newscale > 1)
{
Map.imageScale *= newScale;
transform.ScaleX = Map.imageScale;
transform.ScaleY = Map.imageScale;
}
else
{
transform.ScaleX = transform.ScaleY = 1;
}
}
e.Handled = true;
}
В случае если (! IsZooming), я пытаюсь вычислить центр. Я также пытался использовать различные центры, которые можно найти внутри события e. без каких-либо успехов. Что я делаю неправильно при расчете центра?
Наконец после того, как я увеличил масштаб, я больше не могу панорамировать всю картину. Поэтому мне нужно изменить некоторую переменную, но не смогли ее указать, отлаживая или просматривая веб-страницы. Любая идея для этого?
Ответ Изображение должно быть изменено, а границы области просмотра должны быть установлены на новый размер измененного изображения.
Редактировать Final проблема найти центр, и проблема, когда возникает такая ситуация: поскольку e.PinchManipulation.Current дает относительно площади LightBlue, и я хочу его относительно большой площади, т.е. границ. Как это сделать?