كيفية إنشاء نوع واجهة حوار تفضيلات عرض الشجرة في C#؟

StackOverflow https://stackoverflow.com/questions/3725

  •  08-06-2019
  •  | 
  •  

سؤال

أنا أكتب تطبيقًا يكون في الأساس مجرد مربع حوار تفضيلات، يشبه إلى حد كبير مربع حوار تفضيلات العرض الشجري الذي يستخدمه Visual Studio نفسه.وظيفة التطبيق هي ببساطة تمرير البيانات من جهاز تسلسلي إلى ملف.فهو ينفذ العديد والعديد من التحويلات على البيانات قبل كتابتها إلى الملف، لذا فإن واجهة المستخدم الرسومية للتطبيق هي ببساطة جميع الإعدادات التي تحدد ما يجب أن تكون عليه تلك التحويلات.

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

form design

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

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

المحلول

الطريقة الأكثر ترتيبًا هي إنشاء نماذج منفصلة لكل "جزء" ومجموعة في كل مُنشئ نموذج

this.TopLevel = false;
this.FormBorderStyle = FormBorderStyle.None;
this.Dock = DockStyle.Fill;

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

ربما يمكن أن يستخدم النموذج الرئيسي أ SplitContainer مع ساكنة TreeView في لوحة واحدة، ومساحة لإضافة هذه النماذج في اللوحة الأخرى.بمجرد إضافتها، يمكن قلبها من خلال الاستخدام Hide/Show أو BringToFront/SendToBack طُرق.

SeparateForm f = new SeparateForm(); 
MainFormSplitContainer.Panel2.Controls.Add(f); 
f.Show();

نصائح أخرى

كتب جريج هيرمان:

لماذا لا يتم فقط إظهار/إخفاء الحاوية المناسبة عند تحديد عقدة في الشبكة؟اجعل جميع الحاويات ذات حجم مناسب في نفس المكان، وقم بإخفاء الكل ما عدا الافتراضي، والذي سيتم تحديده مسبقًا في الشبكة عند التحميل.

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

تعجبني إجابة Duncan لأنها تعني إمكانية الاحتفاظ بتصميم واجهة كل عقدة بالكامل متفرق.هذا يعني أنني لا أتداخل مع إرشادات الالتقاط ومزايا وقت التصميم الأخرى.

من المحتمل أن أقوم بإنشاء عدة فئات لوحة بناءً على فئة أساسية ترث CustomControl.سيكون لعناصر التحكم هذه بعد ذلك طرق مثل الحفظ/التحميل وأشياء من هذا القبيل.إذا كان الأمر كذلك يمكنني تصميم كل من هذه اللوحات على حدة.

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

أشعر بالفضول قليلاً بشأن الطريقة التي تنوي بها التعامل مع تحميل/حفظ القيم من/إلى عناصر التحكم؟هل يجب أن يكون هناك الكثير من التعليمات البرمجية في فصل واحد إذا كانت جميع صفحاتك موجودة في نموذج واحد كبير؟

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top