2015-09-17 5 views
1

Когда вы используете колесо мыши на карте, оно будет масштабироваться более или менее, как мы видим на Bing Maps или Google Maps. Я видел, что коэффициент масштабирования составляет 1,2 при каждом прокрутке. Меня попросили изменить его, потому что это было слишком близко или слишком близко. Так что это даже возможно?Изменение коэффициента масштабирования в Bing Maps WPF

Я попытался использовать событие MouseWheel и сам управлять зумом, отключив его с помощью «e.Handled = true;». Он работал в некотором роде, но я теряю анимацию, которая поставляется вместе с ней, а также масштабирование указывает текущий центр карты, а не курсор мыши.

Любая помощь будет оценена, даже если это означает, что это невозможно.

Благодаря

+0

Вы проверили, анимируется ли метод [SetView] (https://msdn.microsoft.com/en-us/library/hh709343.aspx)? – Clemens

ответ

2

Это то, что делает текущая реализация:

В OnMouseWheel он вызывает следующий метод:

this.ZoomAboutViewportPoint(((double) e.Delta)/100.0, e.GetPosition(this)); 

Это реализация:

private void ZoomAboutViewportPoint(double zoomLevelIncrement, Point zoomTargetInViewport) 
{ 
    base.ZoomAndRotateOrigin = new Point?(zoomTargetInViewport); 
    base.ViewBeingSetByUserInput = true; 
    base.SetView((double) (base.TargetZoomLevel + zoomLevelIncrement), base.TargetHeading); 
    base.ViewBeingSetByUserInput = false; 
} 

Очевидно, что вы cant set base.ViewBeingSetByUserInput и base.ZoomAndRotateOrigin непосредственно, поскольку они являются внутренними.

Вы можете использовать только SetView соответственно с координатами вида, но все равно потеряете приятную анимационную часть.

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

--- UPDATE

Как описано выше: Если подключить к MouseWheel Event здесь код, чтобы сделать его работу с помощью отражения вызова частного метода:

void BingMap_MouseWheel(object sender, MouseWheelEventArgs e) 
    { 
    e.Handled = true; 

    System.Reflection.MethodInfo dynMethod = this.BingMap.GetType().GetMethod("ZoomAboutViewportPoint", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); 
    dynMethod.Invoke(this.BingMap, new object[] { (((double)e.Delta)/400d), e.GetPosition(this.BingMap) }); 


    } 

Это сводит до четверти скорости и делает его пригодным для использования с наименьшим количеством кода. Но опять же это взломать!

+0

Зная, что действительно помогает реализация мыши. Если я поместил AnimationLevel в «Full», у меня все еще может быть часть анимации при использовании SetView, так что это здорово. Теперь мне просто нужно выяснить шаблон с помощью ZoomAndRotateOrigin, чтобы центрировать карту в соответствии с фактической позицией курсора. – TheBlainer

+0

Не существует «SetView», где вы описываете центр, например «MapCore.SetView (Location, Double)». Это должно делать свое дело. –

+0

Обычно, когда вы прокручиваетесь, центр перемещается в соответствии с положением курсора мыши. При масштабировании он не остается в том же самом центре. Это то, что я пытаюсь сделать сейчас, потому что да, мы можем установить центр с помощью SetView. – TheBlainer