Dan Desjardins Ответов: 2

Создавать пользовательские метки в VB winform приложения


Мне нужно было добавить реализацию Bing Map в приложение winforms, написанное на VB.

Что я уже пробовал:

Это было не так уж сложно с помощью WPF Interoperability control. Как только я создал элемент управления WPF map, я смог импортировать его в свой проект, и он отлично работает.
Моя проблема заключается в том, что существует только один стиль кнопки по умолчанию. Я ожидал увидеть их в полном вооружении... Глупая я.
Мое новое требование - иметь второй стиль pushpin, но все примеры, которые я нашел, показывают, как это сделать в XAML в WPF или на веб-странице.
Вот текущий код для вставки кнопки на элементе управления WPF в приложении winforms

Private Sub AddPin(PinName as String, Lat as Double, Lon as Double)
  Dim Pin as New Microsoft.Maps.MapControl.WPF.Pushpin
  Pin.Location = New Microsoft.Maps.MapControl.WPF.Location(Lat, Lon)
  Pin.ToolTip = PinName
  Pin.Name = PinName
  MyBingMapUC.Map.Center = Pin.Location
  MyBingMapUC.Map.ZoomLevel = STATE_LEVEL '5
  AddHandler Pin.MouseDown, AddressOf PushpinClick
  BingMapUC.Map.Children.Add(Pin)
End Sub

Private Sub PushpinClick(sender As Object, e As Windows.RoutedEventArgs)
  e.handled = True
  MsgBox("pin " & DirectCast(sender, Microsoft.Maps.MapControl.WPF.Pushpin).Name & " was clicked!")
End sub


Вышесказанное добавляет кнопку по умолчанию. Я не могу найти никакого способа изменить pushpin, используя свойства или методы в классе pushpin. Существует свойство шаблона pushpin. Если это какой-то шаблон XAML, то нет никаких подсказок о том, как его создать или включить в мое приложение WinForms.

Я был бы очень признателен, если бы кто-нибудь мог указать мне правильное направление...

2 Ответов

Рейтинг:
1

Dan Desjardins

Спасибо Грэму - я действительно наткнулся на него, - но решил пробежать каждый его шаг медленно и обдуманно. При этом я узнал, как делать то, что мне нужно, - так что, хотя это все еще было больше о работе полностью в WPF, я смог "интерполировать" то, что мне нужно. Поэтому для тех, кто хочет включить пользовательские кнопки на элементе управления WPF в приложении WinForms, вот как это делается.
В вашем WPF usercontrol вам нужно будет добавить раздел под названием < usercontrol. resources> следующим образом

<UserControl.Resources>
   <ControlTemplate x:Key="yourtemplatenamehere" TargetType="m:Pushpin">
   .... the template constructors here
   </ControlTemplate>
</UserControl.Resources>

Поместите эту секунду чуть выше раздела "сетка".

Теперь в этом примере была довольно уродливая кнопка, определенная в контрольной панели, поэтому я улучшил ее (с большим количеством экспериментов). Таким образом, весь мой ControlTemplate выглядит следующим образом
<UserControl.Resources >
  <ControlTemplate x:Key="MyNewPushpin" TargetType="m:Pushpin">
    <Grid x:Name="ContentGrid" HorizontalAlignment="Center" VerticalAlignment="Center">
     <StackPanel>
       <Grid Margin="0" Width="24" Height="23">
        <Rectangle HorizontalAlignment="Left"  Margin="0,3.238,0,-2.146" Width="23" Height="18" Fill="SteelBlue" Stroke="Black"  RenderTransformOrigin="0.5,0.62">
         <Rectangle.RenderTransform>
          <TransformGroup>
            <ScaleTransform/>
            <SkewTransform AngleY="0" AngleX="-23"/>
            <RotateTransform Angle="123"/>
            <TranslateTransform/>
           </TransformGroup>
          </Rectangle.RenderTransform>
         </Rectangle>
         <Rectangle Fill="{TemplateBinding Background}" Stroke="black" RadiusX="5" RadiusY="5"/>
           <ContentPresenter HorizontalAlignment="Center"                                                                VerticalAlignment="Center"                                                                Content="{TemplateBinding Content}"                                                                ContentTemplate="{TemplateBinding ContentTemplate}"                                                                Margin="0" TextBlock.FontFamily="Segoe UI" TextBlock.FontWeight="Bold" TextBlock.Foreground="Black" >
           </ContentPresenter>
     </Grid>
    </StackPanel>
   </Grid>
 </ControlTemplate>
</UserControl.Resources>

Итак, теперь весь фокус в том, чтобы выяснить, как получить доступ к этому шаблону в winforms...
Ну, пользовательского элемента управления хранится в моей WinForms приложения с помощью Совместимость WPF контроль. Он, как и ваши текстовые поля, метки и панели, является одним из элементов управления, доступных в вашем наборе инструментов после добавления ссылки на него. WindowsFOrmsIntegration и Майкрософт.Карты.Элементом управления mapcontrol.В WPF Чтобы получить их, вам нужно скачать и установить WPF Map SDK, который вы получаете отсюда...
https://msdn.microsoft.com/en-us/library/hh750210.aspx?f=255&MSPPError=-2147217396
Когда вы добавляете Совместимость WPF контроль вы получаете возможность добавить созданный вами элемент управления WPF.
Теперь вы можете получить доступ к шаблону внутри этого элемента управления следующим образом

Dim NewPushpin As System.Windows.Controls.ControlTemplate = BingMapUC.FindResource("MyNewPushpin")


Затем создайте экземпляр и представьте свои кнопки в коде

Dim Pin As New Pushpin
Pin.Location = New Location(Latitude, Longitude)
Pin.Content = "a pin"
Pin.Name = "Pin_" & Counter
Pin.Template = NewPushpin
Pin.Background = Windows.Media.Brushes.YellowGreen
MyBingMapUC.Map.Center = Pin.Location
MyBingMapUC.Map.ZoomLevel = STATE_VIEW
MyBingMapUC.Map.Children.Add(Pin)

В моем шаблоне я выставил фон кнопки, чтобы его можно было изменить по мере необходимости. Это дало мне некоторую гибкость, в которой я нуждался.

Если вы не знаете как собрать WPF usercontrol для использования в winform здесь есть приличный учебник: https://blogs.msdn.microsoft.com/rbrundritt/2013/11/08/using-bing-maps-in-winforms/


Рейтинг:
0

Graeme_Grant

У Google есть несколько отличных ответов: WPF bing maps pushpin - поиск в Google[^]

Как этот: Bing Maps on WPF и custom PushPin tutorial for PixelSense - Деннис ван дер Стелт[^]