我有一个带有MapControl的UWP应用程序。在地图上有一些点显示为图钉。单击/点击项目时,图钉旁边会显示详细信息。但是,似乎绑定到位置无法正常工作。在再次单击该项目或以某种方式移动/缩放/更改地图之前,通常不会显示详细信息控件。调试时,我可以看到该位置在第一次单击时已正确设置,而在第二次单击时并没有再次更改,因此这似乎只是显示/刷新问题。
我创建了一个little demo app that shows the behaviour here。如果单击任何地图图钉,则在其下方将出现一个带有名称的文本块。它(通常)在第一次单击时起作用,但是如果您随后选择其他图钉,则文本(可能)会更改,但位置不会更改。如果您第二次单击该别针,则文本块将正确移动到它。这种情况并非总是会发生,但是从我的测试来看,这种情况似乎大约有90%发生。我还看到了另一个问题,文本块移动到了正确的针脚,但最初没有正确对齐,然后再次单击,它就移动到了正确的位置。
我在这里做错什么了吗?有没有人遇到过这种情况,并且知道如何解决?这是地图控件中的错误吗?如果是的话,是哪里报告这些事情的最佳位置(就像Microsoft在Github上所做的一样,我在任何地方都找不到此错误)。
答案 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>