我的问题很简单,但所有的选项都让我感到困惑......
在我的 MEF/Prism 应用程序中,我想将特定行为附加到一个特定区域。doumentation 说,你可以这样做:
IRegion region = regionManager.Region["Region1"];
region.Behaviors.Add("MyBehavior", new MyRegion());
Run Code Online (Sandbox Code Playgroud)
但是我应该把它放在哪里?有没有地方,这应该用引导程序方法完成?目前,我在 shell 的 Loaded-event 中添加了这样的行为:
/// <summary>
/// Interaction logic for Shell.xaml
/// </summary>
[Export(typeof(Shell))]
public partial class Shell
{
[ImportingConstructor]
public Shell(IRegionManager regionManager, ElementViewInjectionBehavior elementViewInjectionBehavior)
{
InitializeComponent();
Loaded += (sender, args) =>
{
IRegion region = regionManager.Regions[RegionNames.ElementViewRegion];
region.Behaviors.Add("ElementViewInjection", elementViewInjectionBehavior);
};
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个很好的解决方案。我宁愿在引导程序中执行此操作,以便在与其他区域行为注册 ( ConfigureDefaultRegionBehaviors())相同的位置执行此操作。
因此,问题是:将行为添加到单个区域的最佳位置在哪里?
我们遇到了同样的问题 - 最后我们只是检查了区域行为中的区域名称,并且仅当它是我们想要的区域时才采取行动,有点糟糕,因为您将行为附加到所有区域 - 但对我们来说更好比建议的解决方案..
一个例子如下:
public class TrackViewOpenerBehaviour : IRegionBehavior
{
public IRegion Region { get; set; }
public void Attach()
{
if (this.Region.Name == ApplicationRegions.WorkspaceRegion
|| this.Region.Name == ApplicationRegions.DialogRegion)
{
this.Region.Views.CollectionChanged += (sender, e) =>
{
//Code Here.
};
}
}
}
Run Code Online (Sandbox Code Playgroud)
我一直认为也许我们可以创建一个行为,负责为我们将其他行为附加到特定区域,然后我们可以在引导程序中注册它 - 但从未抽出时间来实现它。