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



我有一个带有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>

相关内容

  • 没有找到相关文章

最新更新