Pratiques conseillées : interaction sur la carte
Lorsque vous écrivez un outil qui requiert une interaction avec la souris, utilisez la surface de dessin au lieu d'écouter les clics de la souris. Avec la surface de dessin, vous pouvez facilement capturer les géométries dessinées par les utilisateurs de votre application. Après avoir récupéré ces géométries, vous pouvez les ajouter à une couche de graphiques ou les utiliser en entrée pour d'autres opérations.
Lorsque vous écrivez un outil qui capture les clics sur la carte, procédez comme suit :
- Utilisez l'objet de dessin pour capturer l'entrée de la souris. N'oubliez pas, d'autres outils présents dans l'application Visionneuse active peuvent également capturer les clics de la souris. Pour cette raison, il convient de toujours utiliser l'objet de dessin au lieu d'écouter directement l'événement MouseClick de la carte, car un seul objet de dessin peut être actif à la fois. Si un objet de dessin est activé alors qu'un autre objet de dessin est déjà actif, le deuxième objet de dessin est automatiquement désactivé.
- Ecoutez les changements opérés dans la propriété IsEnabled de l'objet de dessin pour gérer les cas où l'objet de dessin de votre outil a été automatiquement désactivé. Par exemple, si vous implémentez un outil Identifier et que vous disposez d'un objet de dessin actif visant à capturer les clics sur la carte, ainsi qu'une boîte de dialogue visant à afficher les résultats d'identification, vous souhaitez probablement que la boîte de dialogue se ferme lorsqu'un autre outil qui capture l'entrée de la carte est sélectionné. Cela nécessite l'écoute des changements opérés dans la propriété IsEnabled.
L'extrait de code suivant permet de créer une surface de dessin sur la carte, de définir le mode de dessin sur Point et d'écouter la propriété 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