从RegionManager取消注册PRISM区域

时间:2016-01-29 16:32:28

标签: c# prism region

有没有办法从RegionManager取消注册区域?

使用

extension UINavigationController {
    func fhkFindFirst<T: UIViewController>(_: T.Type) -> T? {
        for viewController in viewControllers {
            if let supClassType = viewController.superclass?.dynamicType where supClassType != T.Type.self {
                if let viewController = viewController as? T {
                    return viewController
                }
            }
        }
        return nil
    }
}

class FooBarViewController: UIViewController { }

class FooViewController : FooBarViewController { }
class BarViewController : FooBarViewController { }

let fooBarViewController = FooBarViewController()
let fooViewController = FooViewController()
let barViewController = BarViewController()

let navController = UINavigationController(rootViewController: fooViewController)
navController.addChildViewController(barViewController)
navController.addChildViewController(fooBarViewController)

print(navController.fhkFindFirst(FooViewController) ?? "None found.")
/* <__lldb_expr_1582.FooViewController: 0x7fe22a712e40> */

print(navController.fhkFindFirst(BarViewController) ?? "None found.")
/* <__lldb_expr_1582.BarViewController: 0x7fe22a4196a0> */

print(navController.fhkFindFirst(FooBarViewController) ?? "None found.")
/* <__lldb_expr_1582.FooBarViewController: 0x7fe22a70ee60> */

我在RegionManager注册一个区域。

但是,如果我需要删除该注册(为了再次注册​​完全相同的区域),该怎么办?

===================

这是我的情况:

我有一个实例RegionManager.SetRegionName(myRegion, regionName); RegionManager.SetRegionManager(myRegion, myRegionManager); ,它使用以下命令将UI控件(DependencyObject)myView注册为区域:

myRegion

实例化RegionManager.SetRegionName(myRegion, regionName); RegionManager.SetRegionManager(myRegion, myRegionManager); 时,也会实例化本地区域管理器对象myView

然后我需要再次创建实例myRegionManager,再次进行此注册。

因此,新实例myView也会实例化一个新的本地区域管理器myView,当然没有与之关联的区域。

然后,对myRegionManagerRegionManager.SetRegionName(...)的调用成功,但如果我尝试使用

访问本地区域管理器RegionManager.SetRegionManager(...)
myRegionManager

我收到了IRegion region = myRegionManager.Regions[regionName];

如果我放置

RegionUpdateException

在注册前,string name = RegionManager.GetRegionName(myRegion); IRegionManager regionManager = RegionManager.GetRegionManager(myRegion); 的第一个实例化时两个字段都是空的,但在myView的第二个实例化期间它们确实有值。

但由于myViewmyRegion都与myRegionManager一起新实例化,我希望在调用第二次注册之前,名称和区域管理器也是空的。

2 个答案:

答案 0 :(得分:0)

您可以使用RegionManager&#39; s Regions - 属性按名称删除该区域:

public interface IRegionManager
{
    /// <summary>
    /// Gets a collection of <see cref="IRegion"/> that identify each region by name. You can use this collection to add or remove regions to the current region manager.
    /// </summary>
    IRegionCollection Regions { get; }

    [...]
}

public interface IRegionCollection : IEnumerable<IRegion>, INotifyCollectionChanged
{
    [...]

    /// <summary>
    /// Removes a <see cref="IRegion"/> from the collection.
    /// </summary>
    /// <param name="regionName">Name of the region to be removed.</param>
    /// <returns><see langword="true"/> if the region was removed from the collection, otherwise <see langword="false"/>.</returns>
    bool Remove(string regionName);

    [...]
}

答案 1 :(得分:0)

根据您的描述,听起来您需要拥有相同View的多个实例,其中定义了一个区域,并且能够在这些相应区域内注入其他视图。这是对的吗?

查看有关ScopedRegions的文档:https://github.com/PrismLibrary/Prism/blob/master/Documentation/WPF/50-ComposingtheUserInterface.md#creating-multiple-instances-of-a-region

您还可以观看此Pluralsight课程,该课程向您展示如何使用ScopedRegions:https://app.pluralsight.com/library/courses/prism-showing-multiple-shells/table-of-contents