ArcGIS 10-Add-In: Bringen Sie das andockbare Fenster nach vorne

8

Ich habe ein ArcGIS 10 ArcMap-Add-In in C # .NET 3.5 geschrieben, das ein ESRI.ArcGIS.Desktop.AddIns.DockableWindow(das auch erbt von UserControl) und ein ESRI.ArcGIS.Desktop.AddIns.Tool, das beim Klicken in der Karte das andockbare Fenster aktualisiert , implementiert .

Ich möchte das andockbare Fenster in der Tool- OnMouseDown()Methode (im nicht angedockten Modus) an die Vorderseite der Z-Reihenfolge bringen . Wenn der Benutzer ein anderes andockbares Fenster öffnet, es auf mein Fenster legt und mit dem Tool klickt, wird das Fenster aktualisiert, aber es wird nicht nach vorne gebracht. Ich rufe bereits an, IDockableWindow.Show(true)um sicherzustellen, dass das Fenster nach dem Klicken mit dem Werkzeug sichtbar ist. Ich habe es auch versucht, UserControl.BringToFront()aber es hat keine Wirkung.

Die beste Problemumgehung, die ich derzeit habe, ist das Aufrufen IDockableWindow.Show(false)gefolgt von IDockableWindow.Show(true), dies ist jedoch nicht ideal, da es erschütternd ist, das Fenster verschwinden zu lassen und wieder aufzutauchen sowie es vollständig neu zu streichen, was viel Zeit in Anspruch nimmt.

Das integrierte Identifizierungsfenster weist dieses Problem nicht auf und wird bei jeder Verwendung des Identifizierungswerkzeugs nach oben verschoben. Es gibt also eindeutig eine Möglichkeit, dies zu tun.

Kennt jemand eine bessere Lösung dafür? Vielen Dank!

Bearbeiten: Hier ist der Code, mit dem ich dieses Problem behoben habe. Danke Kirk und Petr!

public static void BringDockableWindowToFront(IDockableWindow dockableWindow, IntPtr dockableWindowControlHandle)
/// <summary>
/// Workaround for bringing a dockable window to the top of the Z order.
/// dockableWindowControlHandle is the Handle property of the UserControl implemented by the dockable window
/// </summary>
{
    IWindowPosition windowPos = dockableWindow as IWindowPosition;
    IntPtr parentHwnd = GetParent(dockableWindowControlHandle); // Get parent window handle
    switch (windowPos.State)
    {
        case esriWindowState.esriWSFloating:
            IntPtr grandParentHwnd = GetParent(parentHwnd); // Get grandparent window handle
            SetActiveWindow(grandParentHwnd);  // Activate grandparent window when in floating (undocked) mode
            break;
        //case esriWindowState.esriWSMaximize: // Mode not yet implemented in ArcGIS 10, check at 10.1
        //case esriWindowState.esriWSMinimize: // Mode not yet implemented in ArcGIS 10, check at 10.1
        case esriWindowState.esriWSNormal:
            SetActiveWindow(parentHwnd); // Activate parent window when in normal (docked) mode
            break;
    }
    SetFocus(dockableWindowControlHandle); // Set keyboard focus to the dockable window
}

// Retrieves a handle to the specified window's parent or owner.
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern IntPtr GetParent(IntPtr hWnd);

// Sets the keyboard focus to the specified window.
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern IntPtr SetFocus(IntPtr hWnd);

// Activates a window.
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern IntPtr SetActiveWindow(IntPtr hWnd);
blah238
quelle
Können Sie mir das Beispiel für das Dockwindow-Add-In senden / senden?

Antworten:

6

Versuchen Sie, den Winapi- Aufruf SetWindowPos mit dem hWnd des andockbaren Fenstersteuerelements (oder möglicherweise dem Containersteuerelement für Eltern oder Großeltern) mit dem Flag HWND_TOP zu verwenden.

Kirk Kuykendall
quelle
Danke Kirk, ich habe genau das versucht, aber es hatte keine Wirkung. Das andockbare Fenster hat kein übergeordnetes Steuerelement, aber die Eigenschaften Left und Top sind 0, daher gehe ich davon aus, dass es tatsächlich ein übergeordnetes Fenster hat (außer der ArcMap-Anwendung). Ich hasse es wirklich, dass es keinen einfacheren Weg gibt, als mit der Windows-API herumzuspielen. Haben Sie selbst Glück damit gehabt?
blah238
Auch seltsam, aber die Eigenschaften Left und Top der IWindowPosition-Co-Klasse sind korrekt, aber die Move-Methode hat keine Auswirkung.
blah238
2
Wenn ich Spy ++ verwende und ein nicht angedocktes Fenster betrachte, sehe ich, dass es sich bei der Urgroßeltern um Arcmap handelt. Ich würde also annehmen, dass der Zorder von den Großeltern des andockbaren Fensters festgelegt wird. Sie haben Recht - es scheint sicher, dass es einen einfacheren Weg gibt.
Kirk Kuykendall
2
Es ist in der Tat das Fenster der Großeltern. Es ist jedoch nicht ideal, sich auf diese Struktur zu verlassen, da sie in zukünftigen Versionen von ArcMap leicht beschädigt werden kann. ESRI sollte wirklich eine Schnittstelle bieten, um dies zu tun.
Petr Krebs
Danke Jungs, es war ein bisschen bescheuert, aber ich konnte es zum Laufen bringen. Die Frage wurde mit der codierten Lösung bearbeitet.
blah238