在Windows 10 Creators升级(build 15063)之后,在移动或缩放地图本身时,我的UWP应用中的MapControl子项不再固定在地图上。 从特定的缩放级别,我注意到在地图上放大时的行为差异。从那时起,就会出现一个视觉地球仪。效果显着。很难描述,但在我看来,地图并不是纯粹的平面(2D)。
在此处查看构建14393上的所需输出,因为您可以看到在移动或缩放地图时雷达覆盖保持在相同位置: 图片:https://www.regenthetin.nl/files/desired_behaviour_v14393.gif
构建15063上的不受欢迎的输出,叠加层随着地图缓慢移动: 图片:https://www.regenthetin.nl/files/undesired_behaviour_v15063.gif
负责任的代码块:
Snippet 1
// Add children to MapControl at specified location
var radarImgPosition = new Geopoint(new BasicGeoposition()
{
Latitude = 59.60,
Longitude = -12.00
});
RadarMap.Children.Clear();
if (RadarMap.Children.Count == 0)
{
RadarMap.Children.Add(radarImg);
MapControl.SetLocation(radarImg, radarImgPosition);
}
Snippet 2
private void RadarMap_ZoomLevelChanged(MapControl sender, object args)
{
Windows.Foundation.Point southWestPoint;
RadarMap.GetOffsetFromLocation(new Geopoint(new BasicGeoposition()
{
Longitude = -11.9687,
Latitude = 46.9106
}), out southWestPoint);
Windows.Foundation.Point northEastPoint;
RadarMap.GetOffsetFromLocation(new Geopoint(new BasicGeoposition()
{
Longitude = 15.5080,
Latitude = 60.0247
}), out northEastPoint);
double radarImgWidth = northEastPoint.X - southWestPoint.X;
double radarImgHeight = Math.Abs(northEastPoint.Y - southWestPoint.Y);
DisplayInformation displayInformation = DisplayInformation.GetForCurrentView();
double scaleValue = (displayInformation.RawPixelsPerViewPixel * 100.0);
radarImg.Height = (radarImgHeight) / (scaleValue / 100);
radarImg.Width = (radarImgWidth) / (scaleValue / 100);
}
我已经在其中进行了几个小时的调查,但到目前为止我还没有找到解决方案。我希望有人可以帮助我!
开发配置:Visual Studio 2017 i.c.m. Windows 10 Creators更新SDK。
答案 0 :(得分:1)
我找到了解决问题的方法,我觉得你的问题是相关的。背景:我的MapControl有一个XAML元素作为子元素,我设置并在元素可见时更改位置。这个孩子显示出与开头已经描述过的效果相同的效果。
事实证明,新的MapControl(创作者更新)在定位孩子时也考虑了高度。换句话说,现在XAML子项位于空间中而不是位于襟翼图上。我猜这是MapControl的新伪3D效果的结果。
解决方案是通过指定地形参照系并将海拔高度设置为0来将孩子定位在地面上:
var location = new Geopoint(new BasicGeoposition
{
Latitude = currentLatitude,
Longitude = currentLongitude,
Altitude = 0
},
AltitudeReferenceSystem.Terrain);
MapControl.SetLocation(myChild, location);