Maps for WPF/Silverlight
項目のレイヤー
Maps の使い方 > 項目のレイヤー

C1MapItemsLayer は、マップ上に項目を表示する最も簡単な方法です。これは ItemsControl を継承するため、UIElement オブジェクトまたは汎用データオブジェクトの追加を直接サポートします。また、それらのオブジェクトをビジュアル項目に変換するために、DataTemplate が使用されます。 C1MapItemsLayer に追加される要素は、C1MapCanvas.LatLong 添付プロパティを使って配置されます。サンプルを紹介します。

XAML
コードのコピー
<c1:C1Maps>
    <c1:C1Maps.Layers>
        <c1:C1MapItemsLayer>
            <Ellipse Width="20" Height="20" Fill="Red" c1maps:C1MapCanvas.LatLong="-79.9247, 40.4587" c1maps:C1MapCanvas.Pinpoint="10, 10"/>
        </c1:C1MapItemsLayer>
    </c1:C1Maps.Layers>
</c1:C1Maps>

これは、XAML で C1Maps コントロールを作成し、その Layers コレクションに C1MapItemsLayer を追加します。Layers コレクションにはレイヤをいくつでも追加でき、それらのレイヤは重ねて表示されます。

この項目レイヤには、1つの項目として、緯度/経度(40.4587, -79.9247)の位置に楕円を追加しています。これらの数値は、XAML では逆になっていることに注意してください。これは、LatLong 値が、経度に対応する X 値と緯度に対応する Y 値から成る Point 構造体で表されるためです(これは、マップと X/Y 軸の通常の配置に一致しています)。

この例では、C1MapCanvas.Pinpoint 添付プロパティが使用されていることもわかります。このプロパティは、要素上のどのポイントを LatLong プロパティで設定された地理座標に置くかを設定します。この例では、楕円の中央が LatLong 位置に来るように、Pinpoint が(10, 10)に設定されています。

2番目の例を紹介します。今回は、コードで C1Maps コントロールを作成し、そのコントロールにデータを設定します。次のクラスを使用します。

C#
コードのコピー
public class Place
{
    public string Name { get; set; }
    public Point LatLong { get; set; }
}

サンプルコードは次のとおりです。

C#
コードのコピー
var map = new C1Maps();
var itemsLayer = new C1MapItemsLayer
{
    ItemsSource = new[]
    {
        new Place {
            Name = "ComponentOne",
            LatLong = new Point(-79.92476,  40.45873), },
        new Place {
            Name = "Greenwich Park",
            LatLong = new Point(  0.00057,  51.47617), },
    },
    ItemTemplate = itemTemplate
};
map.Layers.Add(itemsLayer);
ItemsSource に Place クラスのインスタンスを格納し、ItemTemplate を Page のリソースで定義された次の DataTemplate に設定します。

<DataTemplate x:Name="itemTemplate">
    <StackPanel Orientation="Horizontal" c1maps:C1MapCanvas.LatLong="{Binding LatLong}" c1maps:C1MapCanvas.Pinpoint="5, 5">
        <Ellipse Fill="Red" Width="10" Height="10" />
        <TextBlock Text="{Binding Name}" Foreground="White" />
    </StackPanel>
</DataTemplate>

ItemsSourcePlace クラスのインスタンスを格納し、ItemTemplate を Page のリソースで定義された次の DataTemplate に設定します。

XAML
コードのコピー
<DataTemplate x:Key="itemTemplate">
    <StackPanel Orientation="Horizontal" c1maps:C1MapCanvas.LatLong="{Binding LatLong}" c1maps:C1MapCanvas.Pinpoint="5, 5">
        <Ellipse Fill="Red" Width="10" Height="10" />
        <TextBlock Text="{Binding Name}" Foreground="White" />
    </StackPanel>
</DataTemplate>

この DataTemplate は、C1MapCanvas.LatLong を項目で定義された LatLong にバインドし、TextBlock に Place の Name を表示します。

ItemTemplateItemsSource を使用すると、データベースから簡単にデータをロードできます。データオブジェクトのコレクションを返す Web サービスを設定し、コレクションを ItemsSource として設定し、適切な値をバインドする DataTemplate を作成するだけです。

関連トピック