Tôi có một bổ trợ ArcGIS 10 ArcMap được viết bằng C # .NET 3.5, thực hiện một ESRI.ArcGIS.Desktop.AddIns.DockableWindow
(cũng thừa hưởng từ UserControl
) và một ESRI.ArcGIS.Desktop.AddIns.Tool
khi được nhấp vào trong bản đồ sẽ cập nhật cửa sổ có thể gắn được.
Tôi muốn đưa cửa sổ có thể gắn vào phía trước thứ tự Z trong OnMouseDown()
phương thức của Công cụ (khi ở chế độ không khóa). Hiện tại, nếu người dùng mở một cửa sổ có thể gắn khác, đặt nó lên trên cửa sổ của tôi và nhấp vào bằng công cụ, cửa sổ sẽ cập nhật nhưng nó không được đưa ra phía trước. Tôi đã gọi IDockableWindow.Show(true)
để đảm bảo cửa sổ hiển thị sau khi nhấp bằng công cụ. Tôi cũng đã thử UserControl.BringToFront()
nhưng nó không có tác dụng gì.
Cách giải quyết tốt nhất mà tôi hiện có là gọi IDockableWindow.Show(false)
theo sau IDockableWindow.Show(true)
, tuy nhiên điều này không lý tưởng vì nó bị giật khi cửa sổ biến mất và xuất hiện lại, cũng như phải sơn lại hoàn toàn mất một khoảng thời gian đáng kể.
Cửa sổ Xác định tích hợp không có vấn đề này và được đưa lên đầu mỗi lần sử dụng công cụ Xác định, vì vậy rõ ràng có một cách để làm điều đó.
Có ai biết một giải pháp tốt hơn cho điều này? Cảm ơn!
Chỉnh sửa: Đây là mã tôi đã sử dụng để giải quyết vấn đề này. Cảm ơn Kirk và 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);