4 votos

¿Cómo utilizar ITrackCancel para escapar de la pista IRubberBand?

Tengo un BaseTool para AX_MapControl y AX_PageLayoutControl que permite dibujar una polilínea mediante IRubberBand . Pero una vez iniciada la goma, no se puede cancelar, por ejemplo, pulsando escape. He encontrado ITrackCancel pero lamentablemente no hay manera de utilizarlo correctamente.

ITrackCancel2 esc = new CancelTrackerClass();
esc.CancelOnKeyPress = true;
esc.Reset();

IRubberBand2 rubberBand = new RubberLineClass();
IGeometry geometry = rubberBand.TrackNew(screenDisplay, null);
IPolyline polyline = (IPolyline)geometry;

¿Cómo puedo utilizar ITrackCancel para cancelar el seguimiento de la banda elástica?

Actualización: ITrackCancel puede ser recuperado desde IScreenDisplay pero mi m_hookHelper.ActiveView.ScreenDisplay.CancelTracker es nulo. Utilizo la herramienta con AX_MapControl y AX_PageLayoutControl .

Actualización 2: Descubrí, que incluso Esris posee herramientas como esriControls.ControlsNewLineTool no se puede cancelar con escape en mi aplicación. Tal vez hay un fallo más profundo en alguna parte. Voy a profundizar en ello...

Actualización 3 (Solución): Hay un fallo en mi aplicación WPF. Parece, que al inicio no llegan eventos de teclas al MapControl hasta que no cambie el tamaño de la ventana una vez. Así que esto no es un problema con ITrackCancel sino con la interacción entre WPF y ArcEngine. Gracias de todos modos por su ayuda.

2voto

Nathan Bedford Puntos 3157

La documentación para gomas elásticas sugiere que debe admiten la cancelación mediante la tecla Esc.

Si realmente no le funciona, considere la posibilidad de utilizar un mostrar la retroalimentación en su lugar, por ejemplo, el NewLineFeedback . Los retroalimentadores de pantalla son un poco más complicados que las bandas elásticas, pero no son necesariamente tan difíciles de usar. Además, puede Stop la mayoría de los comentarios a voluntad en cualquier momento (por ejemplo, al pulsar Esc).

1voto

kjo Puntos 197

La coclase ScreenDisplay implementa IScreendisplay que tiene un miembro CancelTracker Interfaz IScreenDisplay Así que debe obtener el botón de escape de prensa por lo que yo sé el código de abajo funciona

public override void OnMouseDown(int Button, int Shift, int X, int Y)
        {

            IMxDocument pMxDoc = (IMxDocument)m_application.Document ;
            IGraphicsContainer pGraCont = (IGraphicsContainer)pMxDoc.ActiveView;
            IRubberBand pRubberLine = new RubberLineClass();
            IElement pElement;
            IPolyline pPolyline = (IPolyline)pRubberLine.TrackNew(pMxDoc.ActiveView.ScreenDisplay,null);
            pElement = new LineElementClass();
            pElement.Geometry = pPolyline;
            pGraCont.AddElement(pElement,0);
            pMxDoc.ActiveView.Refresh();

        }

1voto

David Brossard Puntos 379

Las dos respuestas sugeridas funcionan bien. Tuve otro fallo en mi aplicación WPF, que causó este comportamiento. Parece, que después del inicio ningún evento clave llegó al MapControl hasta que uno cambia el tamaño de la ventana una vez. Después de eso todo funcionaba como se esperaba. Así que no era un problema con ITrackCancel sino con la interacción entre WPF y ArcEngine.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X