Как добавить представление в область PRISM TabControl БЕЗ выделения?

У нас есть приложение WPF, использующее 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));

Проблема в том, что таким образом автоматически выбирается зарегистрированная вкладка. Есть ли способ добавить представление как вкладку, но НЕ выбирать его?


person Elad    schedule 06.05.2015    source источник
comment
Пробовали ли вы активировать ранее активный вид после регистрации?   -  person James Lucas    schedule 06.05.2015
comment
Ну, нет, я не упоминал об этом в своем посте, но я хотел предотвратить срабатывание события UserControl.Loaded, потому что там была проделана тяжелая работа. В конце концов я исправил и это, но только как часть более крупного решения, которое заключалось в реализации настраиваемого адаптера RegionAdapter для элемента управления вкладками, что дает мне больше контроля.   -  person Elad    schedule 06.05.2015


Ответы (1)


Решение, которое я придумал, - реализовать интерфейс для каждого представления и реализовать настраиваемый 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();
    }
}

И, конечно же, в вашем классе Bootstrapper вам понадобится

protected override Microsoft.Practices.Prism.Regions.RegionAdapterMappings ConfigureRegionAdapterMappings()
    {
        var mappings = base.ConfigureRegionAdapterMappings();
        mappings.RegisterMapping(typeof(TabControl), Container.Resolve<TabControlRegionAdapter>());
        return mappings;
    }
person Elad    schedule 06.05.2015