0

我正在编写一个在地图上显示多个位置的 Windows Phone 应用程序。这些职位有电话号码、推特账户和与之相关的网站。

我想要做的是向允许用户打开网站、查看推特或拨打电话号码的项目添加一个上下文菜单。但是,使用 MapItemsControl 获取当前项目并非易事。

我正在寻找一种尽可能无痛的方法来做到这一点。

一些代码:

<mi:MapItemsControl x:Name="mapPins" ItemsSource="{Binding Pushpins}">
    <mi:MapItemsControl.ItemTemplate>
        <DataTemplate>
            <mi:Pushpin Location="{Binding Location}">
                <toolkit:ContextMenuService.ContextMenu>
                    <toolkit:ContextMenu IsEnabled="{Binding ShowContext}" >
                        <TextBlock Opacity="{Binding Opacity, ElementName=image}" Text="Show Menu"/>
                        <TextBlock Opacity="{Binding Opacity, ElementName=image1}" Text="Open Webpage" Tap="EOpenWeb" />
                        <StackPanel Opacity="{Binding Opacity, ElementName=image2}" Orientation="Horizontal" Tap="ECallPhone">
                            <TextBlock Text="Call "/>
                            <TextBlock Text="{Binding Contact.FormattedPhone}"/>
                        </StackPanel>
                        <TextBlock Opacity="{Binding Opacity, ElementName=image3}" Text="On Twitter" Tap="EOpenTwitter" />
                    </toolkit:ContextMenu>
                </toolkit:ContextMenuService.ContextMenu>
                <StackPanel HorizontalAlignment="Stretch">
                    <TextBlock Foreground="{Binding Foreground}"  Text="{Binding Name}" d:LayoutOverrides="HorizontalAlignment"/>
                    <StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Margin="0,-6" Visibility="{Binding ShowGlyphs}">
                        <TextBlock TextWrapping="Wrap" Text="{Binding HereNow}" Visibility="{Binding ShowHere}" VerticalAlignment="Center" FontSize="{StaticResource PhoneFontSizeMediumLarge}" HorizontalAlignment="Left" Height="36" Width="48" TextAlignment="Center"/>
                        <Image x:Name="image" Height="48" Opacity="{Binding HasMenu}" Source="locationGlyphs/appbar.book.open.png" Stretch="Fill"/>
                        <Image x:Name="image1" Height="48" Opacity="{Binding HasWeb}" Source="locationGlyphs/appbar.link.png" Stretch="Fill" Width="48"/>
                        <Image x:Name="image2" Height="48" Opacity="{Binding HasPhone}" Source="locationGlyphs/appbar.phone.png" Stretch="Fill" Width="48"/>
                        <Image x:Name="image3" Height="48" Opacity="{Binding HasTwitter}" Source="locationGlyphs/appbar.twitter.bird.png" Stretch="Fill" Width="48"/>
                    </StackPanel>
                </StackPanel>
            </mi:Pushpin>
        </DataTemplate>
    </mi:MapItemsControl.ItemTemplate>
</mi:MapItemsControl>

这详细说明了如何将对象绘制到地图上。Pushpins 列表只是我的数据的 Observable 集合。

如果这是一个 ListBox,我可以简单地使用 SelectedItem 或类似的东西来解决这个问题,但这似乎不是 MapItemsControl 的选项。有没有人成功地做到这一点?如何?

4

1 回答 1

1

您需要以某种方式对图钉上的点击做出反应。你有一个上下文菜单,你现在显然需要这样做。需要附加一个点击事件处理程序:

<mi:Pushpin
Location="{Binding Location}" Tap="Pushpin_Tap">

Pushpin_Tap 事件处理程序需要像这样管理:

private void Pushpin_Tap(object sender, System.Windows.Input.GestureEventArgs e)
{
    var _ppmodel = sender as Pushpin;
    ContextMenu contextMenu = 
        ContextMenuService.GetContextMenu(_ppmodel);
    contextMenu.DataContext = _viewModel.Pushpins.Where
    (c => (c.Location 
        == _ppmodel.Location)).FirstOrDefault();

    // this way you can find which pushpin/position was tapped by finding the 
    // one which has the same location in your Pushpins observable collection

    if (contextMenu.Parent == null)
    {
        contextMenu.IsOpen = true;
    }
}

我在我的博客上写了关于在图钉点击上显示上下文菜单的文章,所以如果你愿意,你可以去那里阅读整个故事。

于 2012-07-30T07:16:14.203 回答