C# 在.NET中是否有与Mac OS X文档模式表等效的文档?

C# 在.NET中是否有与Mac OS X文档模式表等效的文档?,c#,.net-4.0,modal-dialog,C#,.net 4.0,Modal Dialog,我的应用程序已经收到越来越多的请求,要求某些对话框的行为类似于功能,其中对话框只是父控件/对话框的模态,而不是整个应用程序的模态(请参阅) 当前的windows ShowDialog()不足以满足我的应用程序的需要,因为我需要将一个对话框作为应用程序中另一个对话框的模态,但仍然允许用户访问应用程序的其他区域 在C#.NET中是否有与文档模式表等效的格式?或者甚至是某人已经完成的一个接近的实现,或者是我自己尝试并实现这个功能?我试着在谷歌上搜索,结果一无所获 谢谢 Kyle该方法允许您在调用时指定

我的应用程序已经收到越来越多的请求,要求某些对话框的行为类似于功能,其中对话框只是父控件/对话框的模态,而不是整个应用程序的模态(请参阅)

当前的windows ShowDialog()不足以满足我的应用程序的需要,因为我需要将一个对话框作为应用程序中另一个对话框的模态,但仍然允许用户访问应用程序的其他区域

在C#.NET中是否有与文档模式表等效的格式?或者甚至是某人已经完成的一个接近的实现,或者是我自己尝试并实现这个功能?我试着在谷歌上搜索,结果一无所获

谢谢

Kyle

该方法允许您在调用时指定所有者。在这种情况下,表单仅对给定的所有者是模态的


编辑:我尝试了这个,结果好坏参半。我创建了一个简单的Windows窗体应用程序,其中包含一个主窗体和两个其他窗体。通过单击主窗体上的按钮,我使用Show方法打开了Form2。Form2上也有一个按钮,单击时,我使用ShowDialog方法打开了Form3,并将Form2作为其所有者传入。虽然Form3似乎是Form2的模态,但在关闭Form3之前,我无法切换回Form1。

在重新讨论这个问题后,我进行了一些挖掘,找到了一个适合我需要的混合解决方案

我采纳了以下建议:

我使用以下建议修改了代码以适用于32位和64位编译:

结果如下:

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);
}

它仍然会阻止应用程序,但不会阻止它。海报要求提供一种方法,使其仅阻止应用程序的一个窗口,同时允许来自同一应用程序的其他窗口继续正常处理。tcarvin是正确的。我将用更多细节更新我的问题。尝试使用
Show
,从主窗体打开第二个窗体(Form2a),然后像以前一样继续。查看是否可以切换到Form2a。@John在关闭模式对话框之前,我无法切换到第二个表单。