在Bing Maps WPF中更改缩放系数

时间:2015-09-17 20:04:45

标签: c# wpf bing-maps

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

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

任何帮助都会受到赞赏,即使它说不可能。

由于

1 个答案:

答案 0 :(得分: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;
}

显然,您无法直接设置base.ViewBeingSetByUserInputbase.ZoomAndRotateOrigin,因为它们是内部的。

然而,您可以相应地使用SetView视口坐标,但仍然会松开漂亮的动画部分。

或者你可以通过反射设置上述值,但这是一个脆弱的黑客,如果控件发生变化就容易中断。

---更新

如上所述:如果您连接到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) });


  }

这使其降低到速度的四分之一,并使其可用最少的代码。但这又是一次黑客攻击!