سؤال

كيف يمكنني إنشاء ملف winform وتنفيذه والتحكم فيه من داخل تطبيق وحدة التحكم؟

هل كانت مفيدة؟

المحلول

والخيار الأسهل هو بدء مشروع أشكال النوافذ، ثم تغيير الانتاج من نوع إلى تطبيق وحدة التحكم. بدلا من ذلك، فقط إضافة مرجع إلى System.Windows.Forms.dll، والبدء في الترميز:

using System.Windows.Forms;

[STAThread]
static void Main() {
    Application.EnableVisualStyles();
    Application.Run(new Form()); // or whatever
}

وبت المهم هو [STAThread] على طريقة Main() الخاص بك، مطلوب لدعم COM الكامل.

نصائح أخرى

لقد أردت مؤخرًا القيام بذلك ووجدت أنني لم أكن سعيدًا بأي من الإجابات هنا.

إذا اتبعت نصيحة مارك وقمت بتعيين نوع الإخراج على تطبيق وحدة التحكم، فهناك مشكلتان:

1) إذا قمت بتشغيل التطبيق من Explorer، فستحصل على نافذة وحدة تحكم مزعجة خلف النموذج الخاص بك والتي لا تختفي حتى يخرج البرنامج.يمكننا تخفيف هذه المشكلة عن طريق الاتصال بـ FreeConsole قبل إظهار واجهة المستخدم الرسومية (Application.Run).الإزعاج هنا هو أن نافذة وحدة التحكم لا تزال تظهر.يختفي على الفور، لكنه يبقى هناك للحظة.

2) إذا قمت بتشغيله من وحدة التحكم، وعرضت واجهة المستخدم الرسومية، فسيتم حظر وحدة التحكم حتى تخرج واجهة المستخدم الرسومية.وذلك لأن وحدة التحكم (cmd.exe) تعتقد أنه يجب عليها تشغيل تطبيقات وحدة التحكم بشكل متزامن وتطبيقات Windows بشكل غير متزامن (وهو ما يعادل يونكس لـ "myprocess &").


إذا تركت نوع الإخراج كتطبيق Windows، ولكن بشكل صحيح اتصل بـ AttachConsole، فلن تحصل على نافذة وحدة تحكم ثانية عند استدعائها من وحدة التحكم ولن تحصل على وحدة التحكم غير الضرورية عند استدعائها من Explorer.الطريقة الصحيحة لاستدعاء AttachConsole هي تمرير -1 إليه.يؤدي هذا إلى ربط عمليتنا بوحدة التحكم الخاصة بالعملية الأم (نافذة وحدة التحكم التي أطلقتنا).

ومع ذلك، فإن هذا له مشكلتان مختلفتان:

1) نظرًا لأن وحدة التحكم تقوم بتشغيل تطبيقات Windows في الخلفية، فإنها تعرض المطالبة على الفور وتسمح بمزيد من الإدخال.من ناحية، يعد هذا خبرًا جيدًا، فوحدة التحكم ليست محظورة في تطبيق واجهة المستخدم الرسومية الخاص بك، ولكن في الحالة التي تريد فيها تفريغ الإخراج إلى وحدة التحكم وعدم إظهار واجهة المستخدم الرسومية مطلقًا، فإن إخراج برنامجك يأتي بعد المطالبة ولا توجد مطالبة جديدة يتم عرضها عند الانتهاء.يبدو هذا مربكًا بعض الشيء، ناهيك عن أن "تطبيق وحدة التحكم" الخاص بك يعمل في الخلفية وأن المستخدم حر في تنفيذ أوامر أخرى أثناء تشغيله.

2) يتم العبث بإعادة توجيه الدفق أيضًا، على سبيل المثال.فشل "myapp بعض المعلمات> somefile" في إعادة التوجيه.تتطلب مشكلة إعادة توجيه الدفق قدرًا كبيرًا من p/Invoc لإصلاح المقابض القياسية، ولكنها قابلة للحل.


بعد ساعات طويلة من الصيد والتجربة، توصلت إلى نتيجة مفادها أنه لا توجد طريقة للقيام بذلك بشكل مثالي.لا يمكنك ببساطة الحصول على جميع فوائد كل من وحدة التحكم والنافذة دون أي آثار جانبية.إنها مسألة اختيار الآثار الجانبية الأقل إزعاجًا لأغراض تطبيقك.

وهنا هي أفضل طريقة التي وجدتها: أولا، تعيين مشاريعك انتاج نوع إلى "تطبيق Windows"، ثم P / استدعاء AllocConsole إلى إنشاء إطار وحدة التحكم.

internal static class NativeMethods
{
    [DllImport("kernel32.dll")]
    internal static extern Boolean AllocConsole();
}

static class Program
{

    static void Main(string[] args) {
        if (args.Length == 0) {
            // run as windows app
            Application.EnableVisualStyles();
            Application.Run(new Form1()); 
        } else {
            // run as console app
            NativeMethods.AllocConsole();
            Console.WriteLine("Hello World");
            Console.ReadLine();
        }
    }

}

وهيرو: لقد بسيطة جدا القيام به:

وأضيف سمة والتعليمات البرمجية التالية إلى حسابك في الأسلوب الرئيسي:

[STAThread]
void Main(string[] args])
{
   Application.EnableVisualStyles();
   //Do some stuff...
   while(!Exit)
   {
       Application.DoEvents(); //Now if you call "form.Show()" your form won´t be frozen
       //Do your stuff
   }
}

والآن تذهبين قادرة تماما على إظهار WinForms عناصر:)

ويمكنك إنشاء مشروع winform في VS2005 / VS2008 ثم قم بتغيير خصائصه ليكون تطبيق سطر الأوامر. ويمكن بعد ذلك أن تبدأ من سطر الأوامر، ولكن لا يزال فتح winform.

ويجب أن تكون قادرا على استخدام فئة التطبيق بالطريقة نفسها كما تفعل التطبيقات Winform. ربما كان أسهل طريقة لبدء مشروع جديد هو أن تفعل ما اقترح مارك: إنشاء مشروع Winform جديد، ومن ثم تغييره في خيارات لتطبيق وحدة

وهذا عمل لاحتياجاتي ...

Task mytask = Task.Run(() =>
{
    MyForm form = new MyForm();
    form.ShowDialog();
});

وهذا يبدأ من في موضوع جديد ولا افراج عن موضوع حتى يتم إغلاق النموذج. Task في صافي 4 و في وقت لاحق.

يعتمد الأمر كليًا على اختيارك، وكيفية تنفيذك.
أ.العملية المرفقة، على سبيل المثال:الإدخال في النموذج والطباعة على وحدة التحكم
ب.عملية مستقلة، على سبيل المثال:ابدأ مؤقتًا، ولا تغلقه حتى في حالة خروج وحدة التحكم.

ل,

Application.Run(new Form1());
//or -------------
Form1 f = new Form1();
f.ShowDialog();

ل B ، استخدم الخيط ، أو مهمة أي شيء ،كيفية فتح نموذج الفوز بشكل مستقل؟

إذا كنت تريد الهروب من تجميد النموذج واستخدم التحرير (مثل النص للزر) استخدم هذا الرمز

Form form = new Form();
Form.Button.Text = "randomText";
System.Windows.Forms.Application.EnableVisualStyles();
System.Windows.Forms.Application.Run(form);

جميع الإجابات المذكورة أعلاه هي مساعدة كبيرة، ولكنني فكرت في إضافة بعض النصائح الإضافية للمبتدئين.

لذلك، تريد أن تفعل شيئا مع نماذج Windows، في تطبيق وحدة التحكم:

إضافة مرجع إلى System.Windows.Forms.dll في مشروع تطبيق وحدة التحكم الخاص بك في Solution Explorer.(انقر بزر الماوس الأيمن على اسم الحل->إضافة->مرجع...)

حدد مساحة الاسم في الكود: using System.Windows.Forms;

قم بتعريف الخصائص المطلوبة في فصلك لعناصر التحكم التي ترغب في إضافتها إلى النموذج.

على سبيل المثال int Left { get; set; } // need to specify the LEFT position of the button on the Form

ثم أضف مقتطف التعليمات البرمجية التالي Main():

static void Main(string[] args)
{
Application.EnableVisualStyles();
        Form frm = new Form();  // create aForm object

        Button btn = new Button()
        {
            Left = 120,
            Width = 130,
            Height = 30,
            Top = 150,
            Text = "Biju Joseph, Redmond, WA"
        };
       //… more code 
       frm.Controls.Add(btn);  // add button to the Form
       //  …. add more code here as needed

       frm.ShowDialog(); // a modal dialog 
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top