我的应用程序收到越来越多的请求,要求某些对话框的行为类似于 Mac OS X Document modal Sheet 功能,其中对话框仅对父控件/对话框而不是整个应用程序是模态的(参见 en.wikipedia/wiki/Window_dialog).
My application has been getting more and more requests to have certain dialogs behave similar to Mac OS X Document modal Sheet functionality, where a dialog is modal to just the parent control/dialog, and not the whole application (see en.wikipedia/wiki/Window_dialog).
当前窗口 ShowDialog() 不足以满足我的应用程序的需要,因为我需要让一个对话框成为应用程序中另一个对话框的模态,但仍允许用户访问应用程序的其他区域.
Current windows ShowDialog() is insufficient for the needs of my application, as I need to have a dialog be modal to another dialog in the application, but still allow the user to access other areas of the application.
C# .NET 中是否有与 Document modal Sheet 等效的功能?甚至是某人已经完成的紧密实现,还是我自己尝试实现此功能?我尝试搜索 Google 和 SO 无济于事.
Is there an equivalent to Document modal Sheet in C# .NET? Or even a close implementation someone has done, or am I on my own to try and implement this functionality? I tried searching Google and SO to no avail.
谢谢,
凯尔
推荐答案重新审视这个问题后,我做了一些挖掘,发现了一个可以满足我需求的混合解决方案.
After revisiting this issue, I did some digging and found a hybrid solution that will work for my needs.
我接受了 p-daddy 的建议:stackoverflow/a/428782/654244
我使用 hans-passant:stackoverflow/a/3344276/654244
结果如下:
const int GWL_STYLE = -16; const int WS_DISABLED = 0x08000000; public static int GetWindowLong(IntPtr hWnd, int nIndex) { if (IntPtr.Size == 4) { return GetWindowLong32(hWnd, nIndex); } return GetWindowLongPtr64(hWnd, nIndex); } public static int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong) { if (IntPtr.Size == 4) { return SetWindowLong32(hWnd, nIndex, dwNewLong); } return SetWindowLongPtr64(hWnd, nIndex, dwNewLong); } [DllImport("user32.dll", EntryPoint = "GetWindowLong", CharSet = CharSet.Auto)] private static extern int GetWindowLong32(IntPtr hWnd, int nIndex); [DllImport("user32.dll", EntryPoint = "GetWindowLongPtr", CharSet = CharSet.Auto)] private static extern int GetWindowLongPtr64(IntPtr hWnd, int nIndex); [DllImport("user32.dll", EntryPoint = "SetWindowLong", CharSet = CharSet.Auto)] private static extern int SetWindowLong32(IntPtr hWnd, int nIndex, int dwNewLong); [DllImport("user32.dll", EntryPoint = "SetWindowLongPtr", CharSet = CharSet.Auto)] private static extern int SetWindowLongPtr64(IntPtr hWnd, int nIndex, int dwNewLong); public static void SetNativeEnabled(IWin32Window control, bool enabled) { if (control == null || control.Handle == IntPtr.Zero) return; NativeMethods.SetWindowLong(control.Handle, NativeMethods.GWL_STYLE, NativeMethods.GetWindowLong(control.Handle, NativeMethods.GWL_STYLE) & ~NativeMethods.WS_DISABLED | (enabled ? 0 : NativeMethods.WS_DISABLED)); } public static void ShowChildModalToParent(IWin32Window parent, Form child) { if (parent == null || child == null) return; //Disable the parent. SetNativeEnabled(parent, false); child.Closed += (s, e) => { //Enable the parent. SetNativeEnabled(parent, true); }; child.Show(parent); }更多推荐
.NET 中是否有等效的 Mac OS X 文档模式表?
发布评论