我有一个带有mapcontrol的UWP应用程序。在地图上,有一些点显示为引脚的点列表。单击/点击的详细信息时,将出现在PIN旁边。但是,与位置的约束似乎无法正常工作。详细信息控件通常不会显示在单击项目第二次或以某种方式移动/缩放/更改的地图之前显示。当我调试时,我可以看到第一次单击时正确设置位置,并且在第二次单击时不会再次更改,因此它似乎只是显示/刷新问题。
我创建了一个小型演示应用程序,可以在此处显示行为。如果您单击任何地图引脚,则应以名称出现文本块。它(通常(在第一次点击上工作,但是如果您选择其他引脚(可能(会更改文本,但位置不会。如果您第二次单击该不同的引脚,则文本块将正确移动到它。这并不总是发生,但是从我的测试中,大约90%的时间发生了。我还看到了另一个问题,即文本块移至正确的引脚,但最初未正确对齐,一旦您再次单击它,它就会移至正确的位置。
我在这里做错了吗?有没有人遇到过这个并知道如何解决它?这是地图控件中的一个错误吗?如果是这样,则在哪里报告这些内容(就像Microsoft在Github上放置的那样,我都找不到任何地方(。
uwp mapcontrol.location绑定无法正常工作
我可以重现您的问题,当您单击地图图标然后缩放地图时,位置将正常工作。原因是在选择地图图标之后,地图控件不会刷新。我认为创建新的Grid
并与MAP位置结合DataTemplate
引起此问题。更好的方法是为Thing
模型制作IsVisibility
并处理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>