0

タイプ TabControl の領域を持つ、PRISM を使用する WPF アプリケーションがあります。

    <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 を実装することです。

注:このインターフェイスでは、必要に応じてタブ オーダーも指定できます。

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 に答える