2016-03-01 4 views
0

Проект: C#, wpf, .net4.0, Gmap.Net.Presentation 1.7.1.GMAP.NET C# WFP: Можно ли добавить пользовательский UserControl в наложения GMapControl?

Что у меня есть:

Мой пользовательский класс MapControl унаследовал от класса GMap.NET.WindowsPresentation.GMapControl.

public sealed class MapControl : GMapControl 
{ 
    /* Some special data. */ 

    public MapConrol() 
     : base() 
    { 
     /* Some init actions. */ 
    } 

    /* Overrided and additional methods. */ 
} 

И, например, у меня есть собственный пользовательский класс UserControl.

Код:

public sealed partial class MapObjectMarkerUiControl : UserControl 
{ 
    /* Some special data. */ 

    public MapObjectMarkerUiControl() 
    { 
     /* Some init actions. */ 
    } 

    /* Overrided and additional methods. */ 
} 

Xaml:

<UserControl x:Class="MapCustomControls.MapObjectMarkerUiControl" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      Width="40" Height="40" RenderTransformOrigin="0.5, 0.5"> 
    <Grid> 
     <!-- Some visual controls: text, buttons, etc. --> 
    </Grid> 
</UserControl> 

Пример таможенного контроля пользователя:

enter image description here

Что мне нужно:

Есть ли способ добавить его к карте со ссылкой на гео координаты? Что-то вроде этого: gmap.AddCustomUserControl(UserControl customMarker, double latitude, double longitude);

Может быть, я должен наследовать свой UserControl из другого класса или реализовать некоторый интерфейс Gmap.NET, который позволит добавить мой виджет к карте.

Любые советы, советы, помощь?

P.S. Если я решит эту проблему, я отправлю ее здесь. Думаю, это будет очень полезно для других.

Кроме того, я нашел много вопросов о GMap на StackOverflow и т. Д., И везде я видел класс Overlay.

GMapOverlay markersOverlay = new GMapOverlay("markers"); 
gmap.Overlays.Add(markersOverlay); 

В моей verstion у меня нет этого. У меня уже есть встроенное наложение маркера в класс GMap.

gmap.Markers - ObservableCollection of the GMapMarkers.

И нет никакого способа, чтобы создать свои собственные пометки и добавить его к объекту GMapControl.

ОБНОВЛЕНИЕ 0:

Первая мысль в моей голове. Просто добавьте GMapMarkers на карту с некоторым специальным тегом по идентификатору объекта карты, например. И OnRender() из GMapControl находят все маркеры на экране, анализируют их идентификаторы и рисуют над моим wpf UserControls. Но я надеюсь, что для этого в GMapControl есть встроенная механика.

enter image description here

+0

Я не знаю GMap, но я чувствую, что должно быть легко добавить любой элемент, полученный из UIElement, на карту и указать его местоположение каким-то прикрепленным свойством. Если это невозможно, вы должны попробовать другой элемент управления, например. Bing Maps или XAML Map Control. У них есть MapItemsControl с ItemTemplate (или ItemContainerStyle), где вы можете поместить любой UIElement. И это будет MVVM. – Clemens

+0

Спасибо за совет. Теперь я пытаюсь найти аналог MapItemsControl в GMap. Если его не существует, я не найду другого решения - изменим свой контроль над картой. – Binakot

ответ

1

Я считаю, что решение проще, чем то, что вы уже пробовали, вы можете извлечь из GMapMarker, например,:

экземпляр
class CustomMarker: GMapMarker 
{ 
    public string Description { get; set; } 

    public CustomMarker(PointLatLng pos, string description) 
      : base(pos) 
    { 
     Description = description; 
     Shape = new CustomMarkerElement(); 

     ((CustomMarkerElement)Shape).lblDesc.Content = description;    
    } 
} 

Этот маркер предоставляет доступ к свойствам интерфейса в пределах собственной CustomerMarkerElementUserControl в рамках проекта):

<UserControl x:Class="WpfApplication3.CustomMarkerElement" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"> 
    <Grid> 
     <Ellipse 
      Fill="DarkKhaki" 
      Height="40" 
      HorizontalAlignment="Left" 
      VerticalAlignment="Top" 
      Width="40" /> 

     <Label 
      x:Name="lblDesc" 
      Content="TST" 
      Foreground="White" 
      FontWeight="Bold" 
      HorizontalAlignment="Left" 
      HorizontalContentAlignment="Center" 
      Margin="0,6" 
      VerticalAlignment="Top" 
      Width="40"/> 

    </Grid> 
</UserControl> 

Недостатком является то, что AFAIK нет никакого способа, чтобы иметь это в MVVM (например, определить пользовательские маркеры в шаблоне элемента).

+0

Большое спасибо. Это правильный ответ. Я просто создаю свой собственный CustomMarker и изменяю Shape внутри него. – Binakot

 Смежные вопросы

  • Нет связанных вопросов^_^