0

我正在尝试创建一个弹出对话框,允许用户选择澳大利亚境内的坐标,但是我无法找到 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;
        }
    }

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

谢谢,亚历克斯。

4

2 回答 2

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

于 2012-05-12T09:47:48.660 回答
1

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

以下代码会将地图限制在提供的坐标上,并将其限制在提供的缩放级别。如果需要, 您可以在使用Aerial和之间来回切换。注意:这是 Silverlight 代码,我从来没有弄乱过 WPF 中的地图控件,所以我不确定这是否可行。CustomMode

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