Windows phone 8 (toolkit) кнопки прыгают/мерцают

        <maps:Map x:Name="map">
            <maptk:MapExtensions.Children>
                <maptk:MapItemsControl Name="pushpinItems">
                    <maptk:MapItemsControl.ItemTemplate>
                        <DataTemplate>
                            <maptk:Pushpin GeoCoordinate="{Binding geoCoordinateLocation}" Content="{Binding name}" PositionOrigin="0.5,0.5"/>
                        </DataTemplate>
                    </maptk:MapItemsControl.ItemTemplate>
                </maptk:MapItemsControl>
            </maptk:MapExtensions.Children>
        </maps:Map> 

    ...

    ObservableCollection<PinItem> pinsCollection = new ObservableCollection<PinItem>();


    private async void updateMap()
    {

        WebApiWorker webApi = new WebApiWorker();
        var responce = await webApi.GetAllPins();

        this.pinsCollection.Clear();

        foreach (PinItem pin in responce.array)
        {
            this.pinsCollection.Add(busActivity.MonitoredVehicleJourney);

        }

    }

Я вызываю свой метод updateMap() каждые 5 секунд, чтобы получить обновленные местоположения контактов из веб-службы. Когда кнопки обновляются, они прыгают на экране примерно на 5 мм.

Если я установил канцелярскую кнопку PositionOrigin = "0,0", то булавки больше не прыгают / мерцают, но они немного просеиваются, так как у меня эллиптические канцелярские кнопки.

Любые идеи, как это исправить?


person devha    schedule 11.10.2013    source источник


Ответы (2)


Я использовал пользовательский ControlTemplate для решения этой проблемы:

<ControlTemplate TargetType="toolkit:Pushpin" x:Key="PinTemplate">
    <Grid x:Name="ContentGrid" FlowDirection="LeftToRight" Margin="0,-60,0,0">
        <StackPanel Orientation="Vertical">
            <Grid Background="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Background}" 
                    HorizontalAlignment="Left" 
                    MinHeight="31" 
                    MinWidth="29">
                <ContentPresenter x:Name="Presenter"
                    Content="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content}"
                    FlowDirection="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=FlowDirection}" 
                    Margin="4" VerticalAlignment="Center" HorizontalAlignment="Center"/>
            </Grid>
            <Polygon Fill="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Background}" 
                Points="0,0 29,0 0,29" 
                Width="29" 
                Height="29" 
                Margin="0,-1,0,0"
                HorizontalAlignment="Left"/>
        </StackPanel>
    </Grid>
</ControlTemplate>

Затем я создал кнопки из своего кода следующим образом:

var pp = new Pushpin
{
    Background = cObject.Bcolor,
    GeoCoordinate = cObject.Coordinate,
    Content = ppIc.Convert(cObject.Name, typeof (BitmapImage), null, CultureInfo.CurrentUICulture),
    DataContext = cObject,
    Template = this.Resources["PinTemplate"] as ControlTemplate
};
pp.Tap += UIElement_OnTap;

var overlay = new MapOverlay
{
    Content = pp,
    GeoCoordinate = pp.GeoCoordinate
};
_pushpinLayer.Add(overlay);

Ключевым моментом здесь является установка правильного поля на корневом уровне Grid шаблона канцелярской кнопки, чтобы он перемещал все элементы выше, и вам не нужно было устанавливать PositionOrigin="0,1".

person Bounz    schedule 05.04.2014

Я нашел обходной путь на стороннем сайте:

Я нашел обходной путь. Прежде чем очистить коллекцию PushPin-Collection, которая приводит к этим прыгающим PushPin-ам, я создаю растровое изображение карты и показываю его над картой. Как только коллекция обновится, я снова скрою Bitmap-Map. Это работает на данный момент, но требует больше ресурсов, чем необходимо:

System.Windows.Media.Imaging.WriteableBitmap bmp = new System.Windows.Media.Imaging.WriteableBitmap((int)_map.ActualWidth,(int)_map.ActualHeight);
    bmp.Render(_map, new System.Windows.Media.TranslateTransform());
    bmp.Invalidate();
    MapImage = bmp;
    MapImageVisibility = Visibility.Visible;

Но выглядит не очень :(

person Aleksei Minaev    schedule 11.12.2013