Практические советы: Взаимодействие с картой
При написании инструмента, требующего работы с мышкой, используйте поверхность Draw вместо считывания щелчков мыши. В этом случае вы сможете легко захватывать геометрию объектов, которые создаются пользователями вашего приложения. После получения этой геометрии вы сможете добавить объекты в виде графического слоя и использовать их в качестве входных при осуществлении других операций.
Если вы создаете инструмент, захватывающий щелчки мыши, сделайте следующее:
- Используйте объект Draw для захвата. Помните, что могут быть и другие инструменты в текущем приложении вьюера, которые также захватывают щелчки мыши. Поэтому вам всегда нужно использовать объект Draw вместо прямого считывания щечка мыши MouseClick на карте, поскольку только этот объект может быть активным в этот момент. Если один объект Draw активируется, в то время как другой уже активен, второй объект Draw будет автоматически выключен.
- Считывайте изменения свойства IsEnabled объекта Draw для обработки случаев, когда объект Draw вашего инструмента автоматически выключается. Например, если вы активируете инструмент идентификации при активном объекте Draw для захвата щелчков мыши по карте и показа диалогового окна результатов идентификации, вам может понадобиться закрыть диалоговое окно в момент, когда выбирается другой инструмент, захватывающий карту. Это требует считывания изменений свойства IsEnabled.
Следующий фрагмент кода создает поверхность Draw на карте, устанавливает значение DrawMode равным Point и считывает свойство IsEnabled.
private Identify identifyDialog;
private IdentifyTask identifyTask;
private Draw draw;
public void Execute(object parameter)
{
if (draw == null)
{
draw = new Draw(MapApplication.Current.Map) { DrawMode = ESRI.ArcGIS.Client.DrawMode.Point };
draw.DrawComplete += DrawComplete;
// Listen to the IsEnabled property. This is to detect cases where other tools have
// disabled the Draw surface.
// Utils class shown below.
Utils.RegisterForNotification("IsEnabled", draw, identifyDialog, OnDrawEnabledChanged);
}
draw.IsEnabled = true;
MapApplication.Current.ShowWindow("Identify", identifyDialog, false, null, IdentifyDialogHidden);
}
// Fires when the drawing action is complete. Issues an identify operation using the drawn geometry.
private void DrawComplete(object sender, DrawEventArgs e)
{
MapPoint clickPoint = e.Geometry as MapPoint;
IdentifyParameters identifyParams = new IdentifyParameters()
{
Geometry = clickPoint,
MapExtent = MapApplication.Current.Map.Extent,
LayerOption = LayerOption.visible,
SpatialReference = MapApplication.Current.Map.SpatialReference
};
if (identifyTask.IsBusy)
identifyTask.CancelAsync();
identifyTask.ExecuteAsync(identifyParams);
GraphicsLayer graphicsLayer = MapApplication.Current.Map.Layers["IdentifyResultsLayer"] as GraphicsLayer;
if (graphicsLayer == null)
{
graphicsLayer = createResultsLayer();
MapApplication.Current.Map.Layers.Add(graphicsLayer);
}
else
{
graphicsLayer.ClearGraphics();
}
Graphic graphic = new Graphic() { Geometry = clickPoint };
graphicsLayer.Graphics.Add(graphic);
}
public class Utils
{
public static void RegisterForNotification(string propertyName, object source, FrameworkElement element,
PropertyChangedCallback callback)
{
//Bind to a depedency property.
Binding b = new Binding(propertyName) { Source = source };
var prop = System.Windows.DependencyProperty.RegisterAttached(
"ListenAttached" + propertyName,
typeof(object),
typeof(UserControl),
new PropertyMetadata(callback));
element.SetBinding(prop, b);
}
}
1/23/2014