0

ユーザーがオーストラリア内の座標を選択できるポップアップダイアログを作成しようとしていますが、Silverlightコントロールと非常によく似ていますが、WPFコントロールの特定のドキュメントを見つけるのに問題があります。

基本的に私がやりたいのは、オーストラリアの地図を中央に配置してから3.8のレベルにズームし、その後、ユーザーがオーストラリアの座標範囲外に地図をスクロールしたり、3.8をさらにズームアウトしたり、地図を再中央に配置したりしないようにすることです。オーストラリアの範囲外の別の場所。

これまでの私のコードは次のとおりです。

    <Window x:Class="GetP51.Views.Dialogs.SelectCoordinatesDialog"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:m="clr-namespace:Microsoft.Maps.MapControl.WPF;assembly=Microsoft.Maps.MapControl.WPF"
        Title="GetP51 - Select Coordinates" MinHeight="525" Height="525" MaxHeight="525" MinWidth="500" Width="500" MaxWidth="500" Icon="../../GetP51.ico" WindowStartupLocation="CenterOwner" WindowStyle="ToolWindow">

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="25"></RowDefinition>
            <RowDefinition></RowDefinition>
        </Grid.RowDefinitions>

        <TextBox x:Name="AddressSearch" Grid.Row="0"></TextBox>

        <m:Map x:Name="AustralianMap" Grid.Row="1" CredentialsProvider="key" Mode="Aerial"></m:Map>
    </Grid>
</Window>

そして背後にあるコード:

public partial class SelectCoordinatesDialog : Window
    {
        public SelectCoordinatesDialog()
        {
            InitializeComponent();
            AustralianMap.Center = new Location(-25.274398, 133.775136);
            AustralianMap.ZoomLevel = 3.8;
        }
    }

誰かが私がやろうとしていることを達成する方法を教えてもらえますか?

ありがとう、アレックス。

4

2 に答える 2

1

単純にマップ コントロールを無効にして、マウス入力 (MouseLeftButtonUp など) を取得する透明なコントロール (Canvas など) でオーバーレイすることができます。

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="25"/>
        <RowDefinition/>
    </Grid.RowDefinitions>
    <TextBox x:Name="AddressSearch" Grid.Row="0" />    
    <m:Map Name="AustralianMap" Grid.Row="1"
           ZoomLevel="3.8" Center="-25.274398,133.775136"
           IsEnabled="False" />
    <Canvas Grid.Row="1" Background="Transparent"
            MouseLeftButtonUp="Canvas_MouseLeftButtonUp" />
</Grid>

入力イベント ハンドラーでは、次のように Location を取得できます。

private void Canvas_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
    Location loc = AustralianMap.ViewportPointToLocation(e.GetPosition(AustralianMap));

    System.Diagnostics.Trace.TraceInformation("Hit location {0}", loc);
}

Bing Maps WPF Control API Referenceはこちらです。

于 2012-05-12T09:47:48.660 に答える
1

マップの対応するイベントを自分で処理して無効にするか、次のコードを使用して、マップの移動を特定の範囲の値に制限することができます。

次のコードは、マップを指定された座標に制限し、指定されたズーム レベルに制限します。Aerial必要に応じて、 との使用を切り替えることができCustomModeます。 注:これは Silverlight コードであり、WPF のマップ コントロールをいじったことがないので、これが機能するかどうか確信が持てません。

public class CustomMode : MercatorMode {
    protected static Range<double> validLatitudeRange = new Range<double>(-45.58328975600631, -8.320212289522944);
    protected static Range<double> validLongitudeRange = new Range<double>(110.7421875, 156.533203125);

    protected override Range<double> GetZoomRange(Location center) {
        return new Range<double>(3, 3.8);
    }

    public override bool ConstrainView(Location center, ref double zoomLevel, ref double heading, ref double pitch) {
        bool isChanged = base.ConstrainView(center, ref zoomLevel, ref heading, ref pitch);

        double newLatitude = center.Latitude;
        double newLongitude = center.Longitude;

        if(center.Longitude > validLongitudeRange.To) {
            newLongitude = validLongitudeRange.To;
        } else if(center.Longitude < validLongitudeRange.From) {
            newLongitude = validLongitudeRange.From;
        }

        if(center.Latitude > validLatitudeRange.To) {
            newLatitude = validLatitudeRange.To;
        } else if(center.Latitude < validLatitudeRange.From) {
            newLatitude = validLatitudeRange.From;
        }

        if(newLatitude != center.Latitude || newLongitude != center.Longitude) {
            center.Latitude = newLatitude;
            center.Longitude = newLongitude;
            isChanged = true;
        }

        Range<double> range = GetZoomRange(center);
        if(zoomLevel > range.To) {
            zoomLevel = range.To;
            isChanged = true;
        } else if(zoomLevel < range.From) {
            zoomLevel = range.From;
            isChanged = true;
        }

        return isChanged;
    }
}
于 2012-05-12T14:02:00.973 に答える