UWP MapControl.Location绑定无法正常工作

时间:2019-05-17 16:57:26

标签: c# uwp uwp-xaml uwp-maps

我有一个带有MapControl的UWP应用程序。在地图上有一些点显示为图钉。单击/点击项目时,图钉旁边会显示详细信息。但是,似乎绑定到位置无法正常工作。在再次单击该项目或以某种方式移动/缩放/更改地图之前,通常不会显示详细信息控件。调试时,我可以看到该位置在第一次单击时已正确设置,而在第二次单击时并没有再次更改,因此这似乎只是显示/刷新问题。

我创建了一个little demo app that shows the behaviour here。如果单击任何地图图钉,则在其下方将出现一个带有名称的文本块。它(通常)在第一次单击时起作用,但是如果您随后选择其他图钉,则文本(可能)会更改,但位置不会更改。如果您第二次单击该别针,则文本块将正确移动到它。这种情况并非总是会发生,但是从我的测试来看,这种情况似乎大约有90%发生。我还看到了另一个问题,文本块移动到了正确的针脚,但最初没有正确对齐,然后再次单击,它就移动到了正确的位置。

我在这里做错什么了吗?有没有人遇到过这种情况,并且知道如何解决?这是地图控件中的错误吗?如果是的话,是哪里报告这些事情的最佳位置(就像Microsoft在Github上所做的一样,我在任何地方都找不到此错误)。

1 个答案:

答案 0 :(得分:1)

  

UWP MapControl.Location绑定无法正常工作

我可以重现您的问题,当您单击地图图标然后缩放地图时,该位置将正常工作。原因是在选择地图图标后,地图控件不会刷新。我认为创建新的Grid并与地图位置绑定到DataTemplate会导致此问题。更好的方法是为IsVisibility模型创建Thing并处理DataTemplate中的所有数据绑定。有关详细步骤,请参考以下代码。

public class MainViewModel : BaseViewModel
{
    public MainViewModel()
    {
        Things = new ObservableCollection<Thing>
        {
            new Thing("One World Trade Center", 40.712903, -74.013203, SelectMe),
            new Thing("Carlton Centre", -26.205556, 28.046667, SelectMe),
            new Thing("Q1", -28.006111, 153.429444, SelectMe),
            new Thing("Gran Torre Santiago", -33.416944, -70.606667, SelectMe),
            new Thing("Burj Khalifa", 25.197139, 55.274111, SelectMe),
            new Thing("Lakhta Center", 59.987139, 30.177028, SelectMe),
            new Thing("Long Duration Balloon Payload Preparation Buildings", -77.846323, 166.668235, SelectMe),
        };
    }

    public ObservableCollection<Thing> Things { get; }


    private Thing previousThing;
    private void SelectMe(Thing thing)
    {
        if (previousThing != null) previousThing.IsVisibility = false;
        thing.IsVisibility = true;
        previousThing = thing;
    }
}

public class Thing : BaseViewModel
{
    private bool _isVisibility;

    public Thing(string name, double latitude, double longitude, Action<Thing> selector)
    {
        Name = name;
        Location = new Geopoint(new BasicGeoposition { Latitude = latitude, Longitude = longitude });
        SelectMeCommand = new RelayCommand(() => selector(this));
    }

    public string Name { get; set; }
    public Geopoint Location { get; set; }
    public ICommand SelectMeCommand { get; }
    public bool IsVisibility { get => _isVisibility; set => SetProperty(ref _isVisibility, value); }
}

public class VisibleWhenNotNullConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        return (bool)value == true ? Visibility.Visible : Visibility.Collapsed;
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotSupportedException();
    }
}

Xaml

<map:MapControl HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
    <map:MapItemsControl ItemsSource="{x:Bind ViewModel.Things}">
        <map:MapItemsControl.ItemTemplate>
            <DataTemplate>
                <Grid>
                    <Canvas map:MapControl.Location="{Binding Location}">
                        <Path
                            Margin="0"
                            Data="M14-32h-28v27h8l6 5 6-5h8z"
                            Fill="HotPink"
                            IsHitTestVisible="True"
                            Stroke="Black"
                            StrokeThickness="2"
                            >

                            <interactivity:Interaction.Behaviors>
                                <core:EventTriggerBehavior EventName="Tapped">
                                    <core:InvokeCommandAction Command="{Binding SelectMeCommand, Mode=OneWay}" />
                                </core:EventTriggerBehavior>
                            </interactivity:Interaction.Behaviors>
                        </Path>
                        <TextBlock Text="{Binding Name, Mode=OneWay}" 
                                   Visibility="{Binding IsVisibility, Converter={StaticResource VisibleWhenNotNull}, Mode=OneWay}" />
                    </Canvas>
                </Grid>
            </DataTemplate>
        </map:MapItemsControl.ItemTemplate>
    </map:MapItemsControl>
</map:MapControl>