4

WPFに適さない方法でソリューションを実行していることに気付いた序文。完璧な世界では、MapItemsControlを使用します。

わかりました。WPFにBingMapsコントロールを使用しています。これが私のBingマップXAMLです

<m:Map CredentialsProvider="12345" 
           x:Name="myMap" UseInertia="True" Loaded="Map_Loaded"
           Width="1920" Height="990" Canvas.Top="110" ZoomLevel="5" Center="39.8282,-98.5795">
    <m:MapLayer x:Name="MyPushPinLayer">                
        <Canvas x:Name="ContentPopup" Visibility="Collapsed" Width="250">
            <Border Background="White" BorderThickness="1" BorderBrush="Gray" Width="250" Padding="5">
                <StackPanel Canvas.Left="20" Canvas.Top="10">
                    <TextBlock x:Name="ContentPopupText" FontSize="18" FontWeight="Bold" Foreground="#CF0000" Width="240" TextWrapping="Wrap">
                        </TextBlock>
                    <TextBlock x:Name="ContentAddress" FontSize="13" Foreground="Black" Width="240"  TextWrapping="Wrap"/>
                    <TextBlock x:Name="ContentQuestions" FontSize="13" Foreground="Black" Width="240" TextWrapping="Wrap" />
                </StackPanel>
            </Border>
        </Canvas>
    </m:MapLayer>
</m:Map>

基本的に、これはマップを描画し、クリックしたときにツールチップ情報を保持するマップレイヤーがあります。背後にある私のコードでは、サービスからデータをプルし、次のようにマップに画鋲を手続き的に追加しています。

Pushpin pin = new Pushpin();
pin.Location = new Microsoft.Maps.MapControl.WPF.Location(location.latitude, location.longitude);
pin.Content = location.name;
pin.Template = LGPushPinTemplate;

pin.MouseDown += new MouseButtonEventHandler(pin_MouseDown);
myMap.Children.Add(pin);

かなり簡単です。ただし、マップが読み込まれた後、XAMLと子でポップアップレイヤーを定義しているため、画鋲は地図の子構造の最後に表示され、モーダルインフォボックスは画鋲の下に表示されます。マップの子コレクションからすべてを追加/削除せずに、これらのアイテムのzオーダーを再配置する方法はありますか?|

4

1 に答える 1

3

この問題は解決可能です。周りを検索しているときに、いくつかの可能な解決策を見つけました。下記参照。うまくいけば、あなたはあなたのコード/状況でうまくいく何かを見つけるでしょう。

  1. 最後にポップアップレイヤーを動的に作成できますか?押しピンを生成する方法と同様です。
  2. ポップアップCanvas.ZIndexを多数に設定します。ZIndexを使用したその他のソリューションは次のとおりです。Silverlightコントロール:ZIndexを管理する方法は?

    zindexは、親キャンバスの添付プロパティです。

    たとえば、http://deepearth.codeplex.comでBing Maps Silverlightコントロールの「enhancedMapLayer」を作成し、のようにプロパティとしてzindexを追加しました。

    public int ZIndex
    {
        get { return zIndex; }
        set
        {
            zIndex = value;
            if (Parent != null)
            {
                SetValue(Canvas.ZIndexProperty, zIndex);
            }
         }
     }
    

    infogeometryクラス(すべてのOGCジオメトリタイプのラベル、バルーン、ポイント、ラインストリング、ポリゴン、マルチポリゴンなどを提供します)で、バルーンを起動すると、次のようになります。

       var layer = (EnhancedMapLayer) Parent;
       if (layer != null)
       {
           //set to top z-order
           prevZIndex = layer.ZIndex;
           layer.ZIndex = 1000;
           SetValue(Canvas.ZIndexProperty, 1000);
           applyTranslations();
           balloonShowStoryboard.Begin();
           balloonContainer.Visibility = Visibility.Visible;
           OnBalloon(new BalloonEventArgs { LayerID = layer.ID, ItemID = ItemID });
       }
    

    レイヤーの前のレイヤーを保存するZIndexことで、バルーンを非表示にしたときに正しい順序に復元できます。

    レイヤー間で通信するために、Silverlightのコマンドパターンを使用したので、単に次のように呼び出します。

    Commands.ClosePopupCommand.Execute();

    他のすべてのバルーンを閉じるには、そのイベントにサブスクライブします。 Commands.ClosePopupCommand.Executed += ClosePopupCommand_Executed;

  3. このstackoverflowの回答は、 MicrosoftのInteractiveMapSDKへの言及を含む優れたアプローチを提供します。基本的には、レイヤーを分離してみてください。

        <m:Map CredentialsProvider="Your Key">
            <m:MapLayer>
                <m:MapItemsControl x:Name="ListOfItems"
                            ItemTemplate="{StaticResource LogoTemplate}"
                            ItemsSource="{Binding MyLocalizedEntities}">
                </m:MapItemsControl>
            </m:MapLayer>
            <m:MapLayer>
                <!-- You can have content in multiple layers: Latter layers are infront of former ones. -->
            </m:MapLayer>
        </m:Map>
    
  4. 役立つかもしれない他の同様のstackoverflowの質問。

于 2012-12-27T03:26:16.053 に答える