Empfehlungen: Interaktion mit Karten
Wenn Sie ein Werkzeug schreiben, für das eine Mausinteraktion erforderlich ist, verwenden Sie die Zeichenoberfläche anstelle der Überwachung von Mausklicks. Mit der Zeichenoberfläche können Sie Geometrien, die von den Benutzern Ihrer Anwendung erstellt werden, problemlos erfassen. Nachdem Sie diese Geometrien abgerufen haben, können Sie sie einem Grafik-Layer hinzufügen oder sie als Eingabe für andere Operationen verwenden.
Wenn Sie ein Werkzeug schreiben, das Kartenklicks erfasst, führen Sie die folgenden Schritte aus:
- Verwenden Sie das Zeichnungsobjekt, um die Mauseingabe zu erfassen. Beachten Sie, dass die aktuelle Viewer-Anwendung möglicherweise andere Werkzeuge zum Erfassen von Kartenklicks beinhaltet. Aus diesem Grund sollten Sie immer das Zeichnungsobjekt verwenden, anstatt das "MouseClick"-Ereignis der Karte direkt zu überwachen, da immer nur jeweils ein Zeichnungsobjekt aktiv sein kann. Wenn ein Zeichnungsobjekt aktiviert wird während ein anderes Zeichnungsobjekt bereits aktiv ist, wird das zweite automatisch deaktiviert.
- Überwachen Sie Änderungen der "IsEnabled"-Eigenschaft des Zeichnungsobjekts zum Behandeln von Fällen, in denen das Zeichnungsobjekt des Werkzeugs automatisch deaktiviert wurde. Wenn Sie beispielsweise ein Identifizierungswerkzeug implementieren und gleichzeitig Kartenklicks mit einem aktiven Zeichnungsobjekt erfassen und Identifizierungsergebnisse in einem Dialogfenster anzeigen, empfiehlt es sich möglicherweise, das Dialogfeld zu schließen, wenn ein anderes Werkzeug zum Erfassen von Karteneingaben ausgewählt wird. Dazu ist die Überwachung von Änderungen an der "IsEnabled"-Eigenschaft erforderlich.
Der folgende Codeausschnitt erstellt eine neue Zeichenoberfläche auf der Karte, legt "DrawMode" auf "Punkt" fest und überwacht die "IsEnabled"-Eigenschaft.
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