c# क्या मैक ओएस एक्स दस्तावेज़ मॉडल शीट में एक समान है?




.net-4.0 modal-dialog (2)

मेरा एप्लिकेशन मैक ओएस एक्स दस्तावेज़ मॉडल शीट की कार्यक्षमता के समान कुछ संवाद करने के लिए अधिक से अधिक अनुरोध प्राप्त कर रहा है, जहां एक डायलॉग केवल मूल नियंत्रण / डायलॉग के लिए मॉडल है, और संपूर्ण एप्लिकेशन नहीं (देखें http: // en। wikipedia.org/wiki/Window_dialog )

वर्तमान विंडो ShowDialog () मेरे आवेदन की जरूरतों के लिए अपर्याप्त है, क्योंकि मुझे एक डायलॉग को एप्लिकेशन में किसी अन्य डायलॉग के लिए मॉडेल होना चाहिए, लेकिन फिर भी उपयोगकर्ता को एप्लिकेशन के अन्य क्षेत्रों तक पहुंचने की अनुमति दें।

क्या सी # .NET में दस्तावेज़ मोडल शीट के बराबर है? या यहां तक ​​कि एक करीबी कार्यान्वयन किसी ने किया है, या क्या मैं इस कार्यशीलता की कोशिश करने और उसे लागू करने के लिए स्वयं हूं? मैंने Google और SO को खोज करने की कोशिश की तो कोई फायदा नहीं हुआ।

धन्यवाद,

केली


Form.ShowDialogForm.ShowDialog विधि आपको एक स्वामी निर्दिष्ट करने की अनुमति देता है जब आप उसे कॉल करते हैं। इस मामले में यह फ़ॉर्म केवल दिए गए स्वामी को दिया जाता है।

संपादित करें: मैंने इसे मिश्रित परिणाम के साथ करने की कोशिश की। मैंने एक सामान्य फ़ॉर्म के साथ एक साधारण विंडोज फॉर्म बनाया है, और दो अन्य। मुख्य रूप पर एक बटन क्लिक से, मैंने शो विधि का उपयोग करके फॉर्म 2 खोला। फॉर्म 2 में इसके साथ एक बटन भी होता है, और जब क्लिक किया जाता है, मैंने शोएडियलॉग विधि का उपयोग करके फॉर्म 3 खोला, फॉर्म 2 में गुजरकर मालिक के रूप में। जब Form3 प्रपत्र 2 के लिए प्रतीत होता है, तो मैं फॉर्म 1 पर बंद नहीं कर सकता जब तक कि मैं फॉर्म 3 बंद नहीं करता।


इस मुद्दे पर दोबारा गौर करने के बाद, मैंने कुछ खुदाई की थी और एक हाइब्रिड समाधान पाया जो मेरी आवश्यकताओं के लिए काम करेगा।

मैंने पी-डैडी द्वारा सुझाव दिया: https://.com/a/428782/654244

और मैंने कोड को 32-बिट और 64-बिट के लिए काम करने के लिए संशोधित किया- हंस-पासेंट द्वारा सुझाव का उपयोग करते हुए: https://.com/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);
}




modal-dialog