2015-05-06 34 views
0

我們有一個使用PRISM的WPF應用程序,帶有TabControl類型的區域。如何將視圖添加到PRISM TabControl區域而不進行選擇?

<TabControl prism:RegionManager.RegionName="{x:Static inf:RegionNames.ContentRegion}"> 
     <TabControl.ItemContainerStyle> 
      <Style TargetType="{x:Type TabItem}"> 
       <Setter Property="Header" Value="{Binding TabName}" /> 
      </Style> 
     </TabControl.ItemContainerStyle> 
    </TabControl> 

,我們正與

_regionManager.RegisterViewWithRegion(RegionNames.ContentRegion, typeof(ContentView)); 

問題是,這樣的註冊選項卡將自動被選中註冊的意見。有沒有辦法添加視圖作爲選項卡,但不選擇它?

+0

您是否嘗試激活註冊後,以前的活動有何看法? –

+0

恩,不,我沒有在我的帖子中提到它,但我想阻止UserControl.Loaded事件觸發,因爲在那裏做了一些繁重的工作。最終我也修正了這個問題,但只是作爲一個更大的解決方案的一部分,這個解決方案實現了用於製表控制的自定義RegionAdapter,這使我可以更好地控制。 – Elad

回答

2

我想出的解決方案是爲每個視圖實現一個接口,並實現一個使用它的自定義RegionAdapter。

注意:此界面還允許您指定標籤順序,如果您還需要它。

public interface ITabItemView 
{ 
    int TabItemIndex { get; } 

    bool IsStartupTab { get; } 
} 

public class TabControlRegionAdapter : RegionAdapterBase<TabControl> 
{ 
    private ITabItemView startupTab = null; 

    public TabControlRegionAdapter(IRegionBehaviorFactory factory) 
     : base(factory) 
    { 

    } 

    protected override void Adapt(IRegion region, TabControl regionTarget) 
    { 
     region.Views.CollectionChanged += (s, e) => 
      { 
       if (e.Action == NotifyCollectionChangedAction.Add) 
       { 
        var items = regionTarget.Items; 

        foreach (ITabItemView tab in e.NewItems) 
        { 
         if (tab.TabItemIndex > items.Count) 
          items.Add(tab); 
         else 
          items.Insert(tab.TabItemIndex, tab); 

         if (tab.IsStartupTab) 
         { 
          if (tab != startupTab && startupTab != null) 
           throw new InvalidOperationException("More than one tab is the startup tab."); 

          startupTab = tab; 

          regionTarget.SelectedItem = tab; 
         } 
        } 
       } 
      }; 
    } 

    protected override IRegion CreateRegion() 
    { 
     return new AllActiveRegion(); 
    } 
} 

在你的引導程序類,當然還有你需要

protected override Microsoft.Practices.Prism.Regions.RegionAdapterMappings ConfigureRegionAdapterMappings() 
    { 
     var mappings = base.ConfigureRegionAdapterMappings(); 
     mappings.RegisterMapping(typeof(TabControl), Container.Resolve<TabControlRegionAdapter>()); 
     return mappings; 
    } 
相關問題