WPF, Prism, MEF.Registrar o adaptador de região em um módulo?
-
29-10-2019 - |
Pergunta
É possível registrar um adaptador de região dentro de um módulo?
Eu tenho um ContentControl em meu Shell.xaml definido para a região "MainRegion" que atualmente é preenchido com um módulo contendo o controle AvalonDock.Atualmente, tenho o adaptador de região AvalonDock em meu aplicativo Shell, mas gostaria de colocá-lo no módulo e registrar-se.Quero manter este programa flexível para que, se decidirmos usar algo diferente de AvalonDock, eu possa facilmente usar outro módulo sem ter que modificar meu conjunto Shell (removendo o adaptador da região avalondock).
Imagino que algo assim seja possível.Alguém já fez isso antes?
No bootstrapper agora está:
protected override RegionAdapterMappings ConfigureRegionAdapterMappings()
{
RegionAdapterMappings mappings = base.ConfigureRegionAdapterMappings();
var regionBehaviorFactory = Container.GetExportedValue<IRegionBehaviorFactory>();
var regionManager = Container.GetExportedValue<IRegionManager>();
mappings.RegisterMapping(typeof(Pane), new AvalonRegionAdapter(regionBehaviorFactory, regionManager));
return mappings;
}
Isso é o que eu gostaria de fazer no módulo em vez do bootstrapper do Shell.
Solução
A resposta está aqui em codeplex http://compositewpf.codeplex.com/discussions/250892
O cenário que você está descrevendo é possível. Embora região personalizada os adaptadores devem ser registrados no RegionAdapterMappings no Bootstrapper Método ConfigureRegionAdapterMappings, é possível registrar um costume adaptador de região de dentro de um módulo.
Você poderia, por exemplo, obter um referência aos RegionAdapterMappings em sua classe de módulo usando injeção de construtor, e chame o Método RegisterMapping lá. Isto é possível, pois há uma classe chamada MefRegionAdapterMappings, que exporta os RegionAdapterMappings como um exportação compartilhada. Observe que você deve ser ciente dos problemas de tempo que podem surgir devido a isso. Você deveria ser cuidado para registrar o mapeamento personalizado antes de tentar criar uma região que usa esse adaptador.