wpf - WPF 必应 map 中的信息框

标签 wpf xaml bing-maps pushpin

我最近开始在 WPF 中做一些事情,我想出了一个将 map 集成到我的应用程序中的想法。我用谷歌地图尝试了一些东西,但功能不是很好,所以过了一段时间我放弃了 WPF 中的谷歌地图。

过了一会儿,我碰到了必应 map 。这看起来比谷歌地图与 WPF 一起使用更有希望。我已经开始玩 Bing 的 map ,功能很棒!

然而,当我试图在 map 上放置一个图钉时,当我将鼠标悬停在图钉上时,我并不清楚如何将一个信息框添加到图钉上。我找到了一些示例,但它需要链接到 xaml 的过程代码。我实际上是在寻找一种不使用过程代码的方法。

是否可以仅使用 xaml 将信息框添加到图钉?或者有没有人有一个很好的替代方法来做到这一点?

虽然有一个可用的工具提示属性,但我实际上并没有在寻找它。我实际上是在寻找谷歌地图的图钉风格(如果有的话)。

最佳答案

假设我正确理解了您想要的内容,我相信简短的回答是:对不起,但无法仅使用 XAML 将 Google-Maps 样式的信息框添加到图钉。但是,如果可以的话,我会尽力提供帮助。

免责声明:我一直在使用 Silverlight 的 Bing map 控件,因此希望这也适用于 WPF 版本的控件。

我想您不想使用内置工具提示,因为您希望它看起来不同(即不仅仅是一个带有文本的黄色框),或者因为您希望它在用户将鼠标移开时不会消失。

如果你只是想让它看起来不同,我可以提供以下内容。当我为我的图钉指定模板时,我继续使用重新模板化的工具提示,并允许用户单击图钉以获取更多信息。

Bing Map with custom ToolTip

这是 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.
}

但是,我想您想防止 ToolTip 消失,以便用户可以单击其中的控件。不幸的是,我不确定是否有一种简单的方法可以做到这一点。您可能必须定义自己的自定义控件,这当然需要一些 C#/VB 代码。

也许这个新控件可以派生自图钉,它可以在鼠标悬停和/或单击时显示信息框内容。您可以使用 VisualStateManager 将大部分代码保留在 XAML 中。 C#/VB 只需要为内容提供依赖属性和一些覆盖,以便在正确的时间在视觉状态之间进行转换。

我希望这至少有点帮助!

关于wpf - WPF 必应 map 中的信息框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7555037/

相关文章:

c# - WPF 绑定(bind)到组合框

c# - 通过 DataTrigger 在 WPF TreeViewItem 上设置 IsExpanded

c# - Xamarin.Forms 中没有交互性的覆盖层

xaml - 在 MAUI 中进行设计 - 设计时 BindingContext

c# - 如何在谷歌地图或必应 map 上检索建筑物的坐标(长、宽、高)?

c# - 在 C# 中从 Bing Map API 解析 JSON 代码

WPF:如何获取 ListView 行的高度

c# - 数据绑定(bind)到实例方法

java - 在 Java 中存储 Javascript 对象

c# - WPF 内容控件 : Iterating over child control