سؤال

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

Dropdown Image.

مشكلتي: لملء مربع القائمة، أحتاج إلى الوصول إلى الفصل الذي يدير قائمة الموارد من UITypeEditor.

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

إليك ما تبدو عليه الفصول التي أستخدمها:

class StaticGeometryChunk
{
    // Geometry data to draw with. Contains a reference to its managing 
    // class for use in its UITypeEditor.
    public GeometryData { get; set; }
    ....
}

class Material
{
    // These are XNA classes. I can't just add a reference to its managing 
    // class (I think?).
    public Texture2D Texture1 { get; set; }
    public Texture2D Texture2 { get; set; }
    ....
}

لقد كنت أبحث في خياراتي ويبدو أنها:

  1. اجعل فئات الإدارة ثابتة.

أنا لا أريد حقا أن أفعل هذا.هناك العديد من فئات الإدارة حيث يتم تحميل كل مورد بشكل مختلف.هناك أيضًا فئات يجب إنشاؤها قبلها وتمريرها.

  1. جعل إدارة الطبقات المفردة.

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

  1. قم بإنشاء فئة مجمعة تحتوي على المرجع إلى فئة الإدارة وهدفها (مثل XNA Texture2D).

وهذا هو ما أفكر في القيام به حاليا.سيكون الأمر بسيطًا وسريعًا جدًا ولكن هناك شيئًا ما يزعجني ولكن لا أعرف ما هو.

هل لديك أي أفكار حول الطرق المذكورة أعلاه أو الطرق الأخرى لتمرير ما أحتاجه إلى UITypeEditor؟

شكرا لقرائتك.

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

المحلول

في أسلوب EditValue، يتم منحك سياقًا.استخدم context.Instance للوصول إلى الكائن الذي يحتفظ بممتلكاتك.يجب أن يحتوي هذا الكائن أيضًا على خاصية تتيح لك الوصول إلى قائمة الأشياء التي تريد عرضها.يمكنك اختبار ما إذا كان context.Instance هو ITextureProvider على سبيل المثال، ثم إرساله والوصول إلى الأنسجة.لست متأكدًا مما إذا كان هذا منطقيًا في تصميمك ولكن اسمحوا لي أن أعرف.

نصائح أخرى

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

  1. إنشاء واجهة IYourDataProviderService.
  2. قم بإنشاء تطبيق IYourDataProviderService، الذي يعرف البيانات المحددة التي يجب توفيرها.
  3. إنشاء فئة تنفيذ ISite.في طريقة GetService()، قم بإرجاع مثيل للفئة التي تطبق IYourDataProviderService، إذا كانت معلمة ServiceType هي typeof(IYourDataProviderService).لقد تركت بقية أساليب ISite التي ترمي NotImplementedException (باستثناء خاصية DesignMode) وقد نجحت بالنسبة لي، ولكن ربما لا يكون هذا هو الحل المثالي.
  4. في معالج الأحداث "تحميل"، قم بتعيين التنفيذ الخاص بك إلى خاصية الموقع الخاصة بشبكة الملكية الخاصة بك.
  5. يتمتع!
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top