0

地図上にいくつかの場所を表示するWindowsPhoneアプリケーションを作成しています。これらのポジションには、電話番号、Twitterアカウント、およびWebサイトが関連付けられています。

私がやりたいのは、ユーザーがWebサイトを開いたり、Twitterを表示したり、電話番号に電話をかけたりできるコンテキストメニューをアイテムに追加することです。ただし、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>

これは、オブジェクトがマップにどのように描画されるかを詳しく説明しています。画鋲リストは、私のデータの単なる観察可能なコレクションです。

これが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 に答える