Обрезанная карта Bing не будет обновляться в ScrollViewer? - PullRequest
2 голосов
/ 03 января 2012

У меня есть карта Bing с этим клипом:

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

Карта находится в ScrollViewer где-то внизу, и видна только половина. Проблема в том, что когда я прокручиваю вверх, чтобы показать всю карту, часть карты, которая не была видна, теперь становится черной.

Эта проблема не возникает, когда у меня нет клипа на моей карте. Он отображается правильно. Так это ошибка в контроле или я что-то не так делаю? У кого-нибудь была эта проблема раньше?

Обновление: я сделал небольшой пример проекта, чтобы продемонстрировать это: ссылка . Кроме того, при этом я также заметил, что проблема возникает только тогда, когда элемент управления карты находится внутри сетки. Если я помещу его прямо в ScrollViewer, он будет работать нормально.

Обновление: установка фиксированной высоты для строки сетки не помогает. Кроме того, размещение сетки + карты внутри панели стека, а затем внутри средства просмотра прокрутки не работает. Кто-нибудь из вас нашел что-нибудь, чтобы это исправить?

Ответы [ 3 ]

2 голосов
/ 03 января 2012

Не следует включать элемент управления Bing Map в ScrollViewer или Pivot, Panorama или любой другой элемент управления, который фиксирует жесты панорамирования / прокрутки. Это приведет к очень плохому восприятию пользователя, потому что пользователь не будет знать, будет ли этот жест захвачен картой или управлением хостингом. Я думаю, что происходит, когда вы прокручиваете, вы не прокручиваете ScrollViewer, а скорее панорамируете карту.

1 голос
/ 09 января 2012

При просмотре вашего кода это не имеет ничего общего с картой, на которой фиксируются жесты, а не с ScrollViewer, карта сохраняет свой исходный клип независимо от того, где пользователь запускает прокрутку.Это связано с тем, что элемент управления Map Silverlight (и элемент управления WebBrowser тоже) включают собственный компонент рендеринга.Например, WebBrowser имеет TileHost, как описано в этой статье .По этой причине различные эффекты каркаса Silverlight не могут быть применены к карте, например RenderTransforms.

Чтобы решить вашу проблему, вам придется заставить карту заново визуализировать себя, когда пользователь прокручивает.Для этого я определяю ScrollViewer по вертикали ScrollBar, используя Linq-to-VisualTree , а затем, когда пользовательские свитки применяют очень маленькое увеличение к карте.Это приведет к повторной визуализации:

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

        }
    }
}

Просто перетащите приведенный выше код в ваш пример, и он должен работать.

1 голос
/ 07 января 2012

Попробуйте использовать API-интерфейс Static Bing Maps вместо элемента управления Bing Map, если не хотите, чтобы пользователь взаимодействовал с картой

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

...