我想出的解决方案是为每个视图实现一个接口,并实现一个使用它的自定义 RegionAdapter。
注意:此界面还允许您指定 Tab 键顺序,如果您也需要的话。
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();
}
}
当然,在您的 Bootstrapper 课程中,您需要
protected override Microsoft.Practices.Prism.Regions.RegionAdapterMappings ConfigureRegionAdapterMappings()
{
var mappings = base.ConfigureRegionAdapterMappings();
mappings.RegisterMapping(typeof(TabControl), Container.Resolve<TabControlRegionAdapter>());
return mappings;
}