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);
quelle
Antworten:
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.
quelle