Saya memiliki add-in ArcGIS 10 ArcMap yang ditulis dalam C # .NET 3.5 yang mengimplementasikan ESRI.ArcGIS.Desktop.AddIns.DockableWindow
(yang juga mewarisi dari UserControl
) dan ESRI.ArcGIS.Desktop.AddIns.Tool
yang ketika diklik di peta memperbarui jendela dockable.
Saya ingin membawa jendela dockable ke depan Z-order dalam metode Tool OnMouseDown()
(saat dalam mode undocked). Saat ini, jika pengguna membuka jendela dockable lainnya, meletakkannya di atas tambang, dan mengklik dengan alat, pembaruan jendela tetapi tidak dibawa ke depan. Saya sudah menelepon IDockableWindow.Show(true)
untuk memastikan jendela terlihat setelah mengklik dengan alat ini. Saya juga sudah mencoba UserControl.BringToFront()
tetapi tidak berpengaruh.
Solusi terbaik yang saya miliki saat ini adalah menelepon IDockableWindow.Show(false)
diikuti IDockableWindow.Show(true)
, namun ini tidak ideal karena menggelincir untuk memiliki jendela menghilang dan muncul kembali, serta harus sepenuhnya mengecat ulang yang membutuhkan banyak waktu.
Jendela Identifikasi bawaan tidak memiliki masalah ini dan dibawa ke atas setiap kali alat Identify digunakan, jadi jelas ada cara untuk melakukannya.
Adakah yang tahu solusi yang lebih baik untuk ini? Terima kasih!
Sunting: Ini adalah kode yang saya gunakan untuk menyelesaikan ini. Terima kasih Kirk dan 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);
sumber
Jawaban:
Coba gunakan panggilan winapi SetWindowPos dengan hWnd kontrol jendela dockable (atau mungkin kontrol induk atau kakek-nenek) dengan bendera HWND_TOP.
sumber