Управление картой — всплывающее окно отображается за выводом в UWP

#uwp-xaml #uwp-maps

#uwp-xaml #uwp-карты

Вопрос:

я создал образец приложения UWP с картой и привязал ItemsSource к местоположениям. Когда я нажимаю на любое местоположение, мне нужно отобразить текстовый блок с информацией о нажатом выводе, но текстовый блок находится за выводами.

Может кто-нибудь, пожалуйста, разобраться в этом и сообщить мне, что я здесь делаю не так, пожалуйста.

пример проекта можно загрузить сhttps://1drv.ms/u/s !AiRUJ-H3vDEwgYgbI3nhZ-lvU8EZKg?e= 6qPu4C и снимок экрана прилагается для справки.

всплывающее окно за выводом

Ответ №1:

всплывающее окно отображается за выводом в UWP

Боюсь, вы не можете установить пользовательские элементы xaml поверх карты, потому что в настоящее время он не предоставляет такой возможности zindex poperty. Итак, для этого сценария мы предлагаем поместить текстовый блок в DataTemplate MapItemsControl и присвоить ему левое верхнее значение, чтобы убедиться, что элемент pin не будет закрыт.

 <map:MapControl
    x:Name="myMap"
    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>
                        <Grid
                            Canvas.Left="16"
                            Canvas.Top="-40"
                            Width="300"
                            Height="30"
                            Background="Blue"
                            Canvas.ZIndex="0"
                            Visibility="{Binding Avaiable}">
                            <TextBlock Text="{Binding Name, Mode=OneWay}" />
                        </Grid>
                    </Canvas>
                </Grid>
            </DataTemplate>
        </map:MapItemsControl.ItemTemplate>
    </map:MapItemsControl>
    <map:MapElementsLayer />
  
  

ViewModel

 public class MainViewModel : BaseViewModel
{
    public MainViewModel()
    {
        Things = new ObservableCollection<Thing>
        {

            new Thing("Place One", 17.4947934, 78.3996441, SelectMe),
            new Thing("Place Two", 17.3616, 78.4747, SelectMe),
            new Thing("Place Three", 17.4375, 78.4482, SelectMe),
            new Thing("Place Four", 17.3930, 78.4730, SelectMe)
        };
    }

    public ObservableCollection<Thing> Things { get; }

    private Thing _selectedThing;

    public Thing SelectedThing { get => _selectedThing; private set => SetProperty(ref _selectedThing, value); }
    private Thing previousThing;
    private void SelectMe(Thing thing)
    {
        if (previousThing != null)
        {
            previousThing.Avaiable = false;
        }

        if (thing != null)
        {
            thing.Avaiable = true;
            previousThing = thing;
        }
    }
}

public class Thing : BaseViewModel
{
    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; }
    private bool _avaiable;
    public bool Avaiable
    {
        get => _avaiable;

        set => SetProperty(ref _avaiable, value);

    }
}
  

Комментарии:

1. Выводы будут устанавливаться динамически, поэтому я не могу указать верхнее левое значение, чтобы убедиться, что элемент pin не будет закрыт. предложенное решение не решит проблему 🙁 .

2. Приведенный выше код может динамически настраивать детали вывода, у меня есть образец здесь . пожалуйста, попробуйте.

3. В качестве альтернативы, для простых вещей, таких как кнопки, настоятельно рекомендуется использовать MapIcon, а не закрепленный элемент XAML. Символы карты будут нарисованы как часть холста карты. Такие вещи, как всплывающее окно, лучше всего выполнять в XAML, который всегда будет находиться над холстом карты, поэтому замена кнопок на значок карты должна лучше всего подходить для вашего сценария.