gpt4 book ai didi

c# - Prism 4 - 本地范围的 RegionManager

转载 作者:太空狗 更新时间:2023-10-29 22:20:21 25 4
gpt4 key购买 nike

我有 Silverlight 4 应用程序和 PRISM 4,我正在使用 MEF。

我的 Shell 定义了一个加载模块的主要区域,我希望模块有自己的 RegionManager,因此它们定义的区域位于本地 RegionManager 中,而不是全局的。我希望这个本地 RegionManager 在模块内部由容器(对于 IRegionManager 类型)解析。

但是文档中的方法:

IRegion detailsRegion = this.regionManager.Regions["DetailsRegion"];
View view = new View();
bool createRegionManagerScope = true;
IRegionManager detailsRegionManager = detailsRegion.Add(view, null,
createRegionManagerScope);

对我不起作用,当从 subview 内部解析 IRegionManager 时,我仍然得到 GlobalRegionManager。

最佳答案

我和你的情况一样,我有一个嵌套的区域管理器,但是所有的 subview 仍然得到全局区域管理器。我提出了我认为合理的解决方案。

首先我定义了一个接口(interface):

/// <summary>
/// An interface which is aware of the current region manager.
/// </summary>
public interface IRegionManagerAware
{
/// <summary>
/// Gets or sets the current region manager.
/// </summary>
/// <value>
/// The current region manager.
/// </value>
IRegionManager RegionManager { get; set; }
}

然后我像这样设置一个 RegionBehavior:

/// <summary>
/// A behaviour class which attaches the current scoped <see cref="IRegionManager"/> to views and their data contexts.
/// </summary>
public class RegionAwareBehaviour : RegionBehavior
{
/// <summary>
/// The key to identify this behaviour.
/// </summary>
public const string RegionAwareBehaviourKey = "RegionAwareBehaviour";

/// <summary>
/// Override this method to perform the logic after the behaviour has been attached.
/// </summary>
protected override void OnAttach()
{
Region.Views.CollectionChanged += RegionViewsChanged;
}

private void RegionViewsChanged(object sender, NotifyCollectionChangedEventArgs e)
{
Contract.Requires<ArgumentNullException>(e != null);

if (e.NewItems != null)
foreach (var item in e.NewItems)
MakeViewAware(item);
}

private void MakeViewAware(object view)
{
Contract.Requires<ArgumentNullException>(view != null);

var frameworkElement = view as FrameworkElement;
if (frameworkElement != null)
MakeDataContextAware(frameworkElement);

MakeAware(view);
}

private void MakeDataContextAware(FrameworkElement frameworkElement)
{
Contract.Requires<ArgumentNullException>(frameworkElement != null);

if (frameworkElement.DataContext != null)
MakeAware(frameworkElement.DataContext);
}

private void MakeAware(object target)
{
Contract.Requires<ArgumentNullException>(target != null);

var scope = target as IRegionManagerAware;
if (scope != null)
scope.RegionManager = Region.RegionManager;
}
}

然后将其应用于 Bootstrap 中的所有区域:

protected override IRegionBehaviorFactory ConfigureDefaultRegionBehaviors()
{
var behaviours = base.ConfigureDefaultRegionBehaviors();

behaviours.AddIfMissing(RegionAwareBehaviour.RegionAwareBehaviourKey, typeof(RegionAwareBehaviour));

return behaviours;
}

然后你所要做的就是在你的 View / View 模型上实现IRegionManagerAware,大概是这样的:

public class MyView : IRegionManagerAware
{
IRegionManager RegionManager { set; get; }
}

然后当这个 View 被添加到一个区域时,该行为将正确地将 RegionManager 属性设置为当前作用域的区域管理器。

关于c# - Prism 4 - 本地范围的 RegionManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6582612/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com