2013-08-29 3 views
0

Я пытаюсь создать пользовательский Pushpin для Bing Maps в моем приложении WinRT. Моя проблема в том, что мне нужна ссылка на фактическую карту с моей страницы, чтобы правильно вставить значки в свой userControl. Так, например, это мой DataTemplate, который привязан к карте и отлично работает для обычных кнопок. Для правильной настройки пользовательского UserControl мне нужна ссылка на родительскую карту в userControl.Параметрированный конструктор для WinRT UserControl

Это моя XAML:

<m:MapItemsControl x:Name="Pushpinss" ItemsSource="{Binding InventoryItems}"> 
     <m:MapItemsControl.ItemTemplate> 
      <DataTemplate> 
      <!-- NORMAL PUSHPIN WORKS --> 
      <m:Pushpin> 
       <m:MapLayer.Position> 
       <m:Location Latitude="{Binding WarehouseLatitude}" 
          Longitude="{Binding WarehouseLongitude}" /> 
       </m:MapLayer.Position> 
      </m:Pushpin> 
      <!-- CUSTOM CONTROL DISPLAYS BUT DOES NOT POSITION CORRECTLY BECAUSE I NEED A REFERENCE TO THE MAP--> 
      <View:GPSIcon Latitude="{Binding WarehouseLatitude}" 
          Longitude="{Binding WarehouseLongitude}" 
          Radius="100000"/> 
       <x:Arguments> 
       </x:Arguments> 
      </DataTemplate> 
     </m:MapItemsControl.ItemTemplate> 
     </m:MapItemsControl> 

Это мой пользовательский элемент управления:

public sealed partial class GPSIcon : UserControl 
    { 
    private Map _map; 
    private const double EARTH_RADIUS_METERS = 6378137; 

    public GPSIcon(Map map) 
    { 
     this.InitializeComponent(); 

     _map = map; 
     _map.ViewChanged += (s, e) => 
     { 
     UpdateAccuracyCircle(); 
     }; 
    } 

    public static readonly DependencyProperty LatitudeProperty = 
      DependencyProperty.Register("Latitude", typeof(double), typeof(GPSIcon), new PropertyMetadata(0)); 

    public static readonly DependencyProperty LongitudeProperty = 
     DependencyProperty.Register("Longitude", typeof(double), typeof(GPSIcon), new PropertyMetadata(0)); 

    public static readonly DependencyProperty RadiusProperty = 
     DependencyProperty.Register("Radius", typeof(double), typeof(GPSIcon), new PropertyMetadata(0)); 

    public double Latitude 
    { 
     get { return (double)GetValue(LatitudeProperty); } 
     set { SetValue(LatitudeProperty, value); } 
    } 

    public double Longitude 
    { 
     get { return (double)GetValue(LongitudeProperty); } 
     set { SetValue(LongitudeProperty, value); } 
    } 

    /// <summary> 
    /// Radius in Metres 
    /// </summary> 
    public double Radius 
    { 
     get { return (double)GetValue(RadiusProperty); } 
     set 
     { 
     SetValue(RadiusProperty, value); 
     UpdateAccuracyCircle(); 
     } 
    } 

    private void UpdateAccuracyCircle() 
    { 
     if (_map != null && Radius >= 0) 
     { 
     double groundResolution = Math.Cos(_map.Center.Latitude * Math.PI/180) * 2 * Math.PI * EARTH_RADIUS_METERS/(256 * Math.Pow(2, _map.ZoomLevel)); 
     double pixelRadius = Radius/groundResolution; 

     AccuracyCircle.Width = pixelRadius; 
     AccuracyCircle.Height = pixelRadius; 
     AccuracyCircle.Margin = new Thickness(-pixelRadius/2, -pixelRadius/2, 0, 0); 
     } 
    } 
    } 

Возможно ли это вообще? Я также попытался с помощью х: аргументы директивы, как описано здесь: http://msdn.microsoft.com/en-us/library/ee795382.aspx

Благодарности

ответ

0

UPDATE 1

Выполните следующие изменения

1) Добавить пустой конструктор.

public GPSIcon() 
{ 
    this.InitializeComponent(); 
} 

2) Объявляет DP типа Map

public Map MyMap 
{ 
    get { return (Map)GetValue(MyMapProperty); } 
    set { SetValue(MyMapProperty, value); } 
} 

public static readonly DependencyProperty MyMapProperty = 
    DependencyProperty.Register("MyMap", typeof(Map), typeof(GPSIcon), new PropertyMetadata(default(Map), OnMapSet)); 

private static void OnMapSet(DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
    _map = ((GPSIcon)(d)).MyMap; 
    _map.ViewChanged += (ss, ee) => 
    { 
     ((GPSIcon)(d)).UpdateAccuracyCircle(); 
    }; 
} 

3) Pass Map объект, как это в XAML

<m:Map x:Name="objMap"> 
    <m:MapItemsControl x:Name="Pushpinss" ItemsSource="{Binding InventoryItems}"> 
     <m:MapItemsControl.ItemTemplate> 
      <DataTemplate> 
       <View:GPSIcon Latitude="{Binding WarehouseLatitude}" 
           Longitude="{Binding WarehouseLongitude}" 
           Radius="100000" 
           MyMap="{Binding ElementName=objMap}"/> 
      </DataTemplate> 
     </m:MapItemsControl.ItemTemplate> 
    </m:MapItemsControl> 
</m:Map> 

Объявляет еще одно свойство зависимостей типа Map, а затем вы должны передать текущий экземпляр карты как значение этого DP в <View:GPSIcon ... />

Просто, вы должны следовать той же логике, как Pass parameter to constructor from xaml in Silverlight

+0

Спасибо Я попытался это, но я не могу заставить его связать. Какой синтаксис привязки следует использовать для WinRT? Визуальное дерево jqIndy

+0

См. Обновление 1. – Xyroid

+0

Большое спасибо. Я не могу дождаться выпуска Win8.1. Отладка - это кошмар. Мне пришлось снова создать это приложение, потому что ничего в моем настраиваемом элементе управления больше не работает и по-прежнему не по какой-то причине. Ваш образец имеет смысл. Я дам вам знать, если это сработает, когда я его построю :) – jqIndy

0

Чтобы получить пользовательскую UIElement правильно расположить на карте, что вы можете сделать, вместо того, чтобы делать это в коде просто установить положение UIElement так же, как вы устанавливаете положение кнопки.

Например:

<View:GPSIcon Radius="100000"> 
    <m:MapLayer.Position> 
     <m:Location Latitude="{Binding WarehouseLatitude}" 
        Longitude="{Binding WarehouseLongitude}" /> 
    </m:MapLayer.Position> 
</View:GPSIcon> 
+0

Это замечательно. Большое спасибо за этот комментарий – jqIndy

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