【问题标题】:Change zoom factor in Bing Maps WPF在 Bing Maps WPF 中更改缩放系数
【发布时间】:2015-09-17 20:04:44
【问题描述】:

当您在地图上使用鼠标滚轮时,它或多或少会像我们在 Bing 地图或 Google 地图上看到的那样进行缩放。我看到每次滚动时缩放系数都是 1.2。我被要求更改它,因为它缩放得太远或太近。那么有可能吗?

我尝试使用 MouseWheel 事件并通过使用“e.Handled = true;”禁用它自己来管理缩放。它以某种方式工作,但我失去了它附带的动画,并且缩放指向地图的当前中心而不是鼠标的光标。

任何帮助都将不胜感激,即使它说这是不可能的。

谢谢

【问题讨论】:

  • 你检查SetView方法是否有动画?

标签: c# wpf bing-maps


【解决方案1】:

这是当前的实现正在做的事情:

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;
}

显然你不能直接设置base.ViewBeingSetByUserInputbase.ZoomAndRotateOrigin,因为它们是内部的。

但是,您可以将SetView 与视口坐标相应地使用,但仍会丢失漂亮的动画部分。

或者,您可以通过反射设置上述值,但这是一个脆弱的 hack,如果控制发生变化,很容易中断。

--- 更新

如上所述:如果您连接到MouseWheel 事件,这里是通过私有方法的反射调用使其工作的代码:

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) });


  }

这使它的速度降低了四分之一,并使其可以用最少的代码使用。但这又是一个 hack!

【讨论】:

  • 了解鼠标的实现是真正有帮助的。如果我将 AnimationLevel 设置为“Full”,我仍然可以在使用 SetView 时拥有动画部分,这很棒。现在,我只需要用 ZoomAndRotateOrigin 找出模式,根据光标的实际位置将地图居中。
  • 难道没有SetViewMapCore.SetView (Location, Double) 这样描述中心。这应该可以解决问题。
  • 通常在滚动时,中心会根据鼠标光标的位置移动。缩放时它不会停留在同一中心位置。这就是我现在想要完成的,因为是的,我们可以使用 SetView 设置中心。
  • 更新后:这刚刚解决了我的问题,这是一个 hack,但现在效果很好!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-13
  • 1970-01-01
  • 2017-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多