Инфобокс в WPF Bing Maps - PullRequest
       42

Инфобокс в WPF Bing Maps

5 голосов
/ 26 сентября 2011

Я недавно начал делать некоторые вещи в WPF, и у меня появилась идея интегрировать карты в мое приложение.Я попробовал кое-что с Google Maps, но возможности не так уж хороши, поэтому через некоторое время я отказался от Google Maps в WPF.

Через некоторое время я наткнулся на Bing Maps.Это выглядело гораздо более перспективным, чем Google Maps для использования с WPF.Я начал играть с Bing's Maps, и возможности у меня отличные!

Однако, когда я попытался поместить метку на карту, мне сразу не было ясно, как добавить инфобокс к метке при наведении на нее курсора.Я нашел несколько примеров, как это сделать, но для этого требовался процедурный код, связанный с xaml.Я на самом деле искал метод без использования процедурного кода.

Можно ли добавить инфобокс к кнопке с помощью только xaml?Или у кого-нибудь есть хороший альтернативный метод, как это сделать?

Хотя есть свойство всплывающей подсказки, но на самом деле я этого не искал.Я действительно искал стиль канцелярской кнопки Google Maps (если он доступен).

1 Ответ

8 голосов
/ 27 сентября 2011

Предполагая, что я правильно понимаю, что вы хотите, я считаю, что краткий ответ таков: извините, но невозможно добавить информационное поле в стиле Google-Maps к кнопке с помощью только XAML. Однако я постараюсь помочь, если смогу.

Отказ от ответственности: я играл с элементом управления Bing Maps для Silverlight, поэтому, надеюсь, это будет применимо и к WPF-версии элемента управления.

Я полагаю, что вы не хотите использовать встроенную всплывающую подсказку, потому что хотите, чтобы она выглядела иначе (т.е. не просто желтая рамка с текстом), или потому, что вы хотите, чтобы она не исчезала, когда пользователь перемещает мышь прочь.

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

Bing Map with custom ToolTip

Вот шаблон всплывающей подсказки, определенный как StaticResource, который, конечно, может содержать все, что вы хотите:

<Style x:Key="MyToolTipStyle" TargetType="ToolTip">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate>
                <Border CornerRadius="5" BorderBrush="Black" BorderThickness="2" Background="#5c87b2">
                    <ContentPresenter Margin="5">
                        <ContentPresenter.Content>
                            <StackPanel Margin="5" MaxWidth="400">
                                <TextBlock Text="{Binding Name}" FontWeight="Bold" FontSize="16" Foreground="White" TextWrapping="Wrap"/>
                                <TextBlock Text="{Binding Description}" Foreground="White" TextWrapping="Wrap"/>
                            </StackPanel>
                        </ContentPresenter.Content>
                    </ContentPresenter>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

И вот где я это использовал:

<maps:Map>
    <maps:MapItemsControl ItemsSource="{Binding SearchResultsManager.Items}">
        <maps:MapItemsControl.ItemTemplate>
            <DataTemplate>
                <maps:Pushpin Location="{Binding Location}" Cursor="Hand" MouseLeftButtonUp="Pushpin_MouseLeftButtonUp">
                    <ToolTipService.ToolTip>
                        <ToolTip Style="{StaticResource MyToolTipStyle}" />
                    </ToolTipService.ToolTip>
                </maps:Pushpin>
            </DataTemplate>
        </maps:MapItemsControl.ItemTemplate>
    </maps:MapItemsControl>
</maps:Map>

Тогда я бы справился, когда пользователь нажал на кнопку, чтобы перевести их в область сведений.

private void Pushpin_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
    // Get a reference to the object that was clicked.
    var clickedSearchResult = (sender as FrameworkElement).DataContext as SearchResultViewModel;

    // Do something with it.
}

Однако я полагаю, что вы хотите, чтобы всплывающая подсказка не исчезала, чтобы пользователь мог щелкнуть элементы управления внутри нее. К сожалению, я не уверен, что есть простой способ сделать это. Возможно, вам придется определить свой собственный элемент управления, который, конечно, потребует некоторого кода C # / VB.

Возможно, этот новый элемент управления может быть получен из Pushpin и отображать содержимое информационного поля при наведении курсора мыши и / или щелчке. Вы можете использовать VisualStateManager для хранения большей части кода в XAML. C # / VB просто должен предоставить свойство зависимости для содержимого и некоторые переопределения для перехода между визуальными состояниями в правильное время.

Надеюсь, это хоть немного поможет!

...