سؤال

من عند MSDN.:

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

لدي سيناريو مماثل، وأضف وجهات نظر إلى المناطق في طريقة التهيئة الوحدة النمطية باستخدام RegisterViewWithregion. أحب عرض تفاعل مستخدم يستند إلى القائمة مع قائمة (وهي وحدة نمطية مختلفة).

كيف يمكنني تحقيق هذا السلوك دون كسر السلوك المكتسبة من الوحدات في المنشور؟

هل من الممكن تنشيط / إظهار طريقة عرض تمت إضافتها إلى منطقة، على سبيل المثال بواسطة Modulea من ModuleB؟

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

المحلول

ما أقوم به هو إنشاء سجل عرض في Shell مع الواجهة التالية (أنا تبسيط هنا):

public interface IViewRegistry
{
     void RegisterView(string title, string key, Func<UIElement> viewCreationMethod);
     void OpenView(string key);
}

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

public static class ViewStore
{
     public Dictionary<string, ViewEntry> Views { get; set; }
     static ViewStore()
     {
          Views = new Dictionary<string, ViewEntry>();
     }

     public void RegisterView(string name, string key, Func<UIElement> createMethod)
     {
         Views.Add(key, new ViewEntry() { Name = name, CreateMethod = createMethod });
     }
}

ثم من تطبيق IViewRegistry الخاص بي:

public class ViewRegistryService : IViewRegistry
{
     public void RegisterView(string title, string key, Func<UIElement> createMethod)
     {
          ViewStore.RegisterView(title, key, createMethod);
     }

     public void OpenView(string key)
     {
          //Check here with your region manager to see if
          //the view is already open, if not, inject it
          var view = _regionManager.Regions["MyRegion"].GetView(key);
          if(view != null)
          {
               view = ViewStore.Views[key]();
               _regionManager.Regions["MyRegion"].Add(view, key);
          }
          _regionManager.Regions["MyRegion"].Activate(view);
     }

     private IRegionManager _regionManager;
     public ViewRegistryService(IRegionManager rm)
     {
          _regionManager = rm;
     }
}

الآن لدي شيئان:

  1. عرض ViewStore يمكنني استخدامه لإنشاء قائمة في قذيفة.
  2. وسيلة للوحدات لفتح وجهات النظر المملوكة من قبل وحدات أخرى دون اقتران إلى ما وراء الوحدة البسيطة (في الواقع، حتى الوحدة ليست ضرورية، ولكن ربما صحيح.

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

أيضا، يجب أن تعطي Stackoverflow قليلا من الفرصة للحصول على إجابة ... قدمت لنا فقط 3 ساعات قبل أن تخلى عن :)

أتمنى أن يساعدك هذا.

نصائح أخرى

ليس لدى RegisterViewWithion Overload الذي قبول اسم العرض كمعلمة. هذا كان يمكن أن تخفف من دمج الوحدات النمطية. لقد أضفت عنصر عمل في codeplex.

في الوقت الحالي، أضيف إشارة إلى وحدات أخرى لعرض الحقن وفقدان طبيعة المنشور بشكل فضفاض

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