none
Prism 中的Region 如何更換Module? RRS feed

  • 問題

  • 我現在有一個MainRegion

    Bootstrapper底下

    protected override void ConfigureModuleCatalog()
            {
                base.ConfigureModuleCatalog();

                moduleCatalog.AddModule(typeof(Lib.Modules.Main_Module));
            }

    類別庫的Module

     public class Main_Module : IModule
        {
            private readonly IRegionViewRegistry regionViewRegistry;

            public Main_Module(IRegionViewRegistry registry)
            {
                this.regionViewRegistry = registry; 
            }

            public void Initialize()
            {
                regionViewRegistry.RegisterViewWithRegion("MainRegion", typeof(Contorl_1));
                SubscribeEvent(); //事件
            }

            void SubscribeEvent()
            {
                ChangeMainEvent Event = StaticEventAggregator.MyPrismEvent.GetEvent<ChangeMainEvent>();
                Event.Subscribe(ChangeContent);
            }

     void ChangeContent(int Number)
            {
                 regionViewRegistry.RegisterViewWithRegion("MainRegion", typeof(Contorl_2));
            }

    我想在Contorl_1上按下一個鍵, 就以事件將Contorl_1換成Contorl_2

    程式有進去, 但是都沒有反應....不知道是怎麼回事?

    請問有正規或其他的方式更換Module嗎? 還是說不能變更??

    還有請問有些Module會以OnDemand的形式暫時不載入, 那這樣有什麼意義?? 因為它不顯示出來, 那它的Region 不就是空的了? 空一塊在那邊不適很怪嗎 = =?

     

    感謝回答

     

    2011年1月1日 上午 08:58

解答

  • 正常來說你的程式這種做法應該不是無反應而是error,因為除非容器是stackpanel否則不能同時有多個view放置在region中.
    若要改變region中的view做法如下

    1.先將所有region中的view移除.
               List<object> views = new List<object>(this._regionManager.Regions["RegionName"].Views);

                    foreach (object view in views)
                    {
                        this._regionManager.Regions["RegionName"].Remove(view);
                    }

    2.再重新註冊View到 Region中

    但是如果你的region是包在另一個region中則做法會相當麻煩而不會像上面那麼單純.因為會有生命週期問題.
    所以在Prism 4中提了一個新機制"Navigation"(這個Navigation不是原來Silverlight/WPF中的那個).透過Navigation機制可以很簡單的切換region中的view.

    OnDemand模式可以用outlook程式來舉例,outlook左邊為toolbar右邊為region,而toolbar分為聯絡人,郵件...等等Module,採用OnDemand後則程式不需要一開始就把所有Module載入而是點到要的才載入,這種機制對於Silverlight這種需從Web下載的程式很有用,透過Module分離,不需要一開始就把整個AP載入回CLient大大減少等待時間.

     

    2011年1月4日 上午 02:15