当您在地图上使用鼠标滚轮时,它会像我们在Bing地图或Google地图上看到的那样或多或少地缩放。每次滚动时我都看到缩放因子是1.2。我被要求改变它,因为它变焦得太远或太近。那么它甚至可能吗?
我尝试使用MouseWheel事件并通过“e.Handled = true;”禁用它来自行管理缩放。它在某种程度上起作用,但是我丢失了它附带的动画,并且缩放指向地图的当前中心而不是鼠标的光标。
任何帮助都会受到赞赏,即使它说不可能。
由于
答案 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.ViewBeingSetByUserInput
和base.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) });
}
这使其降低到速度的四分之一,并使其可用最少的代码。但这又是一次黑客攻击!