Это сложно, но определенно можно сделать, я недавно сделал то же самое для аналогичного приложения.Я не буду лгать, мне потребовалось несколько часов, чтобы заставить его работать, поэтому приготовьтесь к тому, чтобы немного почесать голову.
В сущности, есть две вещи:
1.расположение точек в нужном месте
Математика - ваш друг здесь.Вам нужно будет создать несколько методов, которые будут транспонировать координаты на основе multiScaleImage в координаты вашего холста (т.е. области просмотра).
Во-первых, вы должны будете глубоко понять ViewPortOrigin и ViewPortWidth ( this * 1012)* это очень хорошее начало).У них есть пара предостережений (например, я помню, что viewPortHeight нужно умножить на коэффициент изображения, чтобы получить фактическое значение - или что-то похожее).
Чтобы указать вам на решение: вы будетедолжны вычесть viewPortOrigin и умножить / разделить на viewPortWidth.Если вы терпеливы (и удачливы ;-)) сегодня вечером, я посмотрю на свой проект и выложу некоторый код, но будет хорошо, если вы действительно поймете эти параметры - иначе будет сложно отладить и устранить неполадки.
Что-то, что помогло мне понять, что происходит, - это поместить несколько текстовых блоков и отобразить viewportWidth / Origin / etc.все время во время навигации по multiscaleImage.
edit: вам повезло, я запомнил это, так что вот код, который должен помочь.Опять же, я предлагаю вам не просто копировать и вставлять без понимания, поскольку вы не доберетесь до этого далеко.
private Point CanvasToDeepZoom(MultiScaleImage msi, Point absoluteInsideCanvas)
{
// the only non-logical (to me) step: viewportOrigin.Y must be multiplied by the aspectRatio
var ViewportHeight = msi.ViewportWidth * msi.AspectRatio * msi.ActualHeight / msi.ActualWidth;
var relativeToCanvas = new Point(
absoluteInsideCanvas.X / msi.ActualWidth,
absoluteInsideCanvas.Y / msi.ActualHeight);
return new Point(
msi.ViewportOrigin.X + msi.ViewportWidth * relativeToCanvas.X,
msi.ViewportOrigin.Y * msi.AspectRatio + ViewportHeight * relativeToCanvas.Y);
}
private Point DeepZoomToCanvas(MultiScaleImage msi, Point relativeInsideDeepZoom)
{
var ViewportHeight = msi.ViewportWidth * msi.AspectRatio * msi.ActualHeight / msi.ActualWidth;
var relativeToCanvas = new Point(
(relativeInsideDeepZoom.X - msi.ViewportOrigin.X) / msi.ViewportWidth,
(relativeInsideDeepZoom.Y - msi.ViewportOrigin.Y * msi.AspectRatio) / ViewportHeight);
return new Point(
relativeToCanvas.X * msi.ActualWidth,
relativeToCanvas.Y * msi.ActualHeight);
}
2.синхронизация точек во время анимации масштабирования и панорамирования.
Основная идея состоит в том, чтобы зациклить анимацию длиной 0 секунд, которая постоянно обновляет положение точек в течение всей продолжительности масштабирования / панорамирования (1,5 секунды).если я правильно помню).техника очень хорошо объяснена здесь .В этом блоге вы также найдете другие полезные ресурсы для вашей конкретной проблемы.