0

我们有一个使用 PRISM 的 WPF 应用程序,其区域类型为 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));

问题是,这样注册的选项卡会自动被选中。有没有办法将视图添加为选项卡但不选择它?

4

1 回答 1

3

我想出的解决方案是为每个视图实现一个接口,并实现一个使用它的自定义 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;
    }
于 2015-05-06T12:00:24.477 回答