我正在尝试创建一个弹出对话框,允许用户在澳大利亚选择坐标,但是我无法找到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;
}
}
有人可以告诉我如何完成我想做的事吗?
谢谢, 亚历克斯。
答案 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);
}
答案 1 :(得分: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;
}
}