#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, который всегда будет находиться над холстом карты, поэтому замена кнопок на значок карты должна лучше всего подходить для вашего сценария.