Bing地图控件仅限于一个国家?

时间:2012-05-12 05:08:16

标签: c# wpf .net-4.0 bing-maps

我正在尝试创建一个弹出对话框,允许用户在澳大利亚选择坐标,但是我无法找到WPF控件的特定文档,即使它与Silverlight控件非常相似。

基本上我想做的是将地图置于澳大利亚中心,然后缩放到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;
        }
    }

有人可以告诉我如何完成我想做的事吗?

谢谢, 亚历克斯。

2 个答案:

答案 0 :(得分:1)

您可以简单地禁用地图控件并使用透明控件(例如Canvas)覆盖它以获取鼠标输入(例如MouseLeftButtonUp):

<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>

在输入事件处理程序中,您可以获得如下位置:

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

答案 1 :(得分:1)

您可以自行处理地图的相应事件,也可以尝试使用以下代码将地图移动限制在给定的值范围内。

以下代码会将地图约束为提供的坐标,并将其限制为提供的缩放级别。如果需要,您可以在使用AerialCustomMode之间来回切换。 注意:这是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;
    }
}