5

我正在使用 Prism 创建一个应用程序,但遇到了一些障碍。

我有一个选项卡控件,它是一个棱镜区域,并且有一个 ItemsSource 集合,我们将模型绑定到该集合。该模型包含设置选项卡标题、视图名称和随机 id(在本例中为 Guid)所需的数据,我们用于生成动态 prism 区域,作为选项卡内容中的容器,具有自己的 prism 区域,并且可以被导航到。

+Prism region(tab control)
|+ Prism region (dynamically created with Guid name)
 |+ Inserted view
  |+ Prism region
  |+ Prism region
  |+ Prism region
|+ Prism region (dynamically created with Guid name)    |
 |+ Inserted view
  |+ Prism region
  |+ Prism region
  |+ Prism region

我遇到的问题是我们尝试生成的区域似乎没有在区域管理器中注册,即使我们似乎正确地注册了它们。

不幸的是,围绕团队进行的一系列搜索和问题并未带来任何可行的解决方案。

我想知道是否有人以前尝试过这个,或者是否有任何好的资源可以在代码中动态生成棱镜区域并注册它们。

4

1 回答 1

8

我已经在我的应用程序中做到了这一点。这是我想出的代码:

string regionName = "MyRegionName";
ContentPresenter RegionContentControl = new ContentPresenter { Focusable = false };

// This creates the region
Microsoft.Practices.Prism.Regions.RegionManager.SetRegionName(RegionContentControl, regionName);

// This adds the region to your region manager.
Microsoft.Practices.Prism.Regions.RegionManager.SetRegionManager(RegionContentControl, RegionManager);

// Get the region back
IRegion newRegion = RegionManager.Regions.FirstOrDefault(x => x.Name == regionName);

我从 Unity 获得 RegionManger。

更新:

Mark 指出,ContentPresenter 是不允许开箱即用的。这是在以下位置添加该功能的适配器:

public class ContentPresenterRegionAdapter : RegionAdapterBase<ContentPresenter>
{
    public ContentPresenterRegionAdapter(IRegionBehaviorFactory behaviorFactory)
        : base(behaviorFactory)
    {
    }

    protected override void Adapt(IRegion region, ContentPresenter regionTarget)
    {
        region.Views.CollectionChanged += (s, e) =>
            {
                if (e.Action == NotifyCollectionChangedAction.Add)
                {
                    foreach (FrameworkElement element in e.NewItems)
                    {
                        regionTarget.Content = element;
                    }
                }
                else if (e.Action == NotifyCollectionChangedAction.Remove)
                {
                     foreach (FrameworkElement currentElement in e.OldItems)
                         regionTarget.Content = null;
                }
            };
    }

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

要注册此映射,您需要将其添加到引导程序中:

protected override RegionAdapterMappings ConfigureRegionAdapterMappings()
{
   RegionAdapterMappings mappings = base.ConfigureRegionAdapterMappings();
   mappings.RegisterMapping(typeof(ContentPresenter), 
                            Container.Resolve<ContentPresenterRegionAdapter>());
   return mappings;
}
于 2012-10-29T20:48:51.160 回答