剪切的Bing地图不会在ScrollViewer中刷新?

时间:2012-01-03 09:58:54

标签: windows-phone-7.1 bing-maps windows-phone-7

我有一个带有此剪辑的bing地图:

<my:Map.Clip>
     <RectangleGeometry RadiusX="15" RadiusY="15" Rect="0,0,450,250" />
</my:Map.Clip>

地图位于底部某处的ScrollViewer中,只有一半是可见的。 问题是当我向上滚动以显示整个地图时,地图中不可见的部分现在是黑色的。

当我的地图上没有剪辑时,不会发生此问题。它被正确呈现。 那么这是控件中的错误还是我做错了什么? 以前有人遇到过这个问题吗?

更新:我已经制作了一个小样本项目来证明这一点:link。此外,在执行此操作时,我还注意到问题仅在地图控件位于网格内时发生。如果我将它直接放在ScrollViewer中,它就可以正常工作。

更新:为网格行设置固定高度没有帮助。此外,将网格+地图放在堆栈面板内,然后放在滚动查看器内部不起作用。你们中的任何人都找到了解决这个问题的方法吗?

3 个答案:

答案 0 :(得分:2)

您不应在ScrollViewer或Pivot,Panorama或任何其他捕获平移/滚动手势的控件中包含Bing Map控件。这将导致非常差的用户体验,因为用户将不知道手势是否将由地图或主机控件捕获。我认为发生的是当你滚动时,你不是在滚动ScrollViewer,而是在平移地图。

答案 1 :(得分:1)

如果您不希望用户与地图进行互动,请尝试使用Static Bing Maps API而不是Bing Map控件

http://msdn.microsoft.com/en-us/library/ff701724.aspx

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

        }
    }
}

只需将上面的代码放到您的示例中即可。