我有一个带有此剪辑的bing地图:
<my:Map.Clip>
<RectangleGeometry RadiusX="15" RadiusY="15" Rect="0,0,450,250" />
</my:Map.Clip>
地图位于底部某处的ScrollViewer中,只有一半是可见的。 问题是当我向上滚动以显示整个地图时,地图中不可见的部分现在是黑色的。
当我的地图上没有剪辑时,不会发生此问题。它被正确呈现。 那么这是控件中的错误还是我做错了什么? 以前有人遇到过这个问题吗?
更新:我已经制作了一个小样本项目来证明这一点:link。此外,在执行此操作时,我还注意到问题仅在地图控件位于网格内时发生。如果我将它直接放在ScrollViewer中,它就可以正常工作。
更新:为网格行设置固定高度没有帮助。此外,将网格+地图放在堆栈面板内,然后放在滚动查看器内部不起作用。你们中的任何人都找到了解决这个问题的方法吗?
答案 0 :(得分:2)
您不应在ScrollViewer或Pivot,Panorama或任何其他捕获平移/滚动手势的控件中包含Bing Map控件。这将导致非常差的用户体验,因为用户将不知道手势是否将由地图或主机控件捕获。我认为发生的是当你滚动时,你不是在滚动ScrollViewer,而是在平移地图。
答案 1 :(得分:1)
如果您不希望用户与地图进行互动,请尝试使用Static Bing Maps API而不是Bing Map控件
答案 2 :(得分:1)
在查看代码时,这与捕获手势的地图而不是ScrollViewer
无关,无论用户在何处发起滚动,地图都会保留其原始剪辑。
此行为的原因是Map
Silverlight控件(以及WebBrowser
控件)也包含本机呈现组件。例如,WebBrowser
有一个TileHost
,如in this article所述。因此,各种Silverlight框架效果无法应用于地图,例如RenderTransforms。
要解决您的问题,您必须在用户滚动时强制地图重新渲染。为此,我使用Linq-to-VisualTree找到ScrollViewer
垂直ScrollBar
,然后在用户滚动时将非常小的缩放应用到地图。这将导致它重新渲染:
using System.Linq;
using System.Windows;
using System.Windows.Controls.Primitives;
using LinqToVisualTree;
using Microsoft.Phone.Controls;
namespace BingMapClipIssueDemo
{
public partial class MainPage : PhoneApplicationPage
{
// Constructor
public MainPage()
{
InitializeComponent();
this.Loaded += new RoutedEventHandler(ContentPanel_Loaded);
}
void ContentPanel_Loaded(object sender, RoutedEventArgs e)
{
ScrollBar verticalScroll = ContentPanel.Descendants<ScrollBar>()
.Cast<ScrollBar>()
.Where(sb => sb.Orientation == System.Windows.Controls.Orientation.Vertical)
.Single();
verticalScroll.ValueChanged += (s, e2) =>
{
map.ZoomLevel = map.ZoomLevel + 0.00001;
};
}
}
}
只需将上面的代码放到您的示例中即可。