2017-10-18 143 views
0

我正在查看专门针对https://github.com/PrismLibrary/Prism-Samples-Wpf/tree/master/6-ViewActivationDeactivation的PrismLibrary的WPF示例。我的目标是创建ViewActivationDeactivation解决方案的工作版本,但使用MefBootstrapper而不是本示例中最初使用的UnityBoostrapper。在xaml中设置RegionName时,使用MefBootstrapper激活/取消激活WPF应用程序中的视图

我有这样

public class Bootstrapper : MefBootstrapper 
{ 
    protected override void ConfigureAggregateCatalog() 
    { 
     AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(Bootstrapper).Assembly)); 
     base.ConfigureAggregateCatalog(); 
    } 
    protected override DependencyObject CreateShell() 
    { 
     return Container.GetExportedValue<MainWindow>(); 
    } 

    protected override void InitializeShell() 
    { 
     Application.Current.MainWindow = (MainWindow)Shell; 
     Application.Current.MainWindow.Show(); 
    } 

    protected override CompositionContainer CreateContainer() 
    { 
     var container = base.CreateContainer(); 
     container.ComposeExportedValue(container); 
     return container; 
    } 
} 

配置我的引导程序类和主窗口的代码如下所示:

XAML

<Window x:Class="DuoApp_ViewNav.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:DuoApp_ViewNav" 
     xmlns:v="clr-namespace:DuoApp_ViewNav.Views" 
      xmlns:prism="http://prismlibrary.com/" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525"> 
    <DockPanel LastChildFill="True"> 
     <ContentControl prism:RegionManager.RegionName="ContentRegion" HorizontalAlignment="Center" VerticalAlignment="Center" /> 
    </DockPanel> 
</Window> 

xaml.cs

[Export] 
public partial class MainWindow : Window 
{ 
    private CompositionContainer _container; 
    private IRegionManager _regionManager; 
    IRegion _region; 

    ViewA _viewA; 
    ViewB _viewB; 

    [ImportingConstructor] 
    public MainWindow(CompositionContainer container, IRegionManager regionManager) 
    { 
     InitializeComponent(); 
     _container = container; 
     _regionManager = regionManager; 

     this.Loaded += MainWindow_Loaded; 
    } 

    private void MainWindow_Loaded(object sender, RoutedEventArgs e) 
    { 
     _viewA = _container.GetExportedValue<ViewA>(); 
     _viewB = _container.GetExportedValue<ViewB>(); 

     _region = _regionManager.Regions["ContentRegion"]; 

     _region.Add(_viewA); 
     _region.Add(_viewB); 
    } 
} 

的我现在面临的问题是,在主窗口初始化失败,它抛出时,试图在ContentControl中 内设置RegionName内部异常消息发生

激活错误,同时试图让System.Windows.Markup.XamlParseException 型DelayedRegionCreationBehavior的情况下,关键的 “”

这里异常的全部细节

System.Windows.Markup.XamlParseException发生
HResult = -2146233087 LineNumber = 12 LinePosition = 10 Message ='Set property'Prism.Regions.RegionManager.RegionName'throw a exception。' 行号“12”和行位置“10”。
源= PresentationFramework堆栈跟踪: 在System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader,IXamlObjectWriterFactory writerFactory,布尔 skipJournaledProperties,对象rootObject,XamlObjectWriterSettings 设置,乌里基本URI) 在System.Windows.Markup.WpfXamlLoader.LoadBaml (xamlReader xamlReader,布尔skipJournaledProperties,对象rootObject, XamlAccessLevel ACCESSLEVEL,乌里基本URI) 在System.Windows.Markup.XamlReader.LoadBaml(流流,parserContext parserContext,父对象,布尔closeStream) 在System.Windows.Application.LoadComponent (Object component,Uri resourceLocator) at DuoApp_ViewNav.MainWindow.InitializeComponent()i ÑC:\用户\ ralfaro \文件\的Visual Studio 2015 \项目\ DuoApp_ViewNav \ DuoApp_ViewNav \ MainWindow.xaml:线1
的InnerException: 的HResult = -2146233088 尝试获取类型DelayedRegionCreationBehavior的实例消息=激活错误发生在 ç 在Microsoft.Practices.ServiceLocation.ServiceLocatorImplBase.GetInstance(类型 的serviceType,String键)::,键 “” 源= Microsoft.Practices.ServiceLocation 堆栈跟踪\项目\ CommonServiceLocator \主\ Microsoft.Practices.ServiceLocation \ ServiceLocatorImplBase.cs:行 at Microsoft.Practices.ServiceLocation.ServiceLocatorImplBase.GetInstanceTServic e in c:\ Projects \ CommonServiceLocator \ main \ Microsoft.Practices.ServiceLocation \ ServiceLocatorImplBase。CS:线在Prism.Regions.RegionManager.CreateRegion(DependencyObject的元件) 在Prism.Regions.RegionManager.OnSetRegionNameCallback(DependencyObject的 元件,DependencyPropertyChangedEventArgs参数) 在System.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs E) 在System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs E) 在System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs 参数) 在System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex,的DependencyProperty DP,PropertyMetada TA的元数据, EffectiveValueEntry oldEntry,EffectiveValueEntry & newEntry,布尔 coerceWithDeferredReference,布尔coerceWithCurrentValue, OperationType operationType) 在System.Windows.DependencyObject.SetValueCommon(的DependencyProperty DP, 对象值,PropertyMetadata元数据,布尔 coerceWithDeferredReference,布尔coerceWithCurrentValue, OperationType operationType,布尔isInternal) 在System.Windows.Baml2006.WpfMemberInvoker.SetValue(Object实例, 对象的值) 在MS.Internal.Xaml.Runtime.ClrObjectRuntime.SetValue(XamlMember构件, 对象OBJ,对象的值) 在MS.Internal.Xaml.Runtime.ClrObjectRuntime.SetValue(对象研究所, XamlMember属性,对象的值) 的InnerException: 的HResult = -2146233088 尝试获取类型的实例DelayedRegionCreationBehavior消息=激活错误发生,关键 “” 源= Microsoft.Practices.Prism.MefExtensions 堆栈跟踪: 在Microsoft.Practices.Prism.MefExtensions.MefServiceLocatorAdapter.DoGetInstance(类型 的serviceType,String键) 在Microsoft.Practices.ServiceLocation.ServiceLocatorImplBase.GetInstance(类型 的serviceType,字符串键) c:\ Projects \ CommonServiceLocator \ main \ Microsoft.Practices.ServiceLocation \ ServiceLocat orImplBase.cs:行的InnerException:

老实说,我不知道为什么这会抛出异常。我错过了什么使这个工作与MefBootstrapper?

回答

0

终于搞明白了。我错误地引用了两个有MefBootstrapper实现的程序集,Prism.Mef和Prism.MefExtensions。删除Prism.MefExtensions包/引用后,应用程序开始正常工作。 我上次的故障排除步骤,我发现它非常有用,内容丰富,它是在本地运行Prism库代码并从那里添加所需的引用,这使我可以认识到MefExtensions不是必需的。

我packages.config文件的当前版本是这样的:

<?xml version="1.0" encoding="utf-8"?> 
<packages> 
    <package id="CommonServiceLocator" version="1.3" targetFramework="net461" /> 
    <package id="Prism.Core" version="6.3.0" targetFramework="net461" /> 
    <package id="Prism.Mef" version="6.3.0" targetFramework="net461" /> 
    <package id="Prism.Wpf" version="6.3.0" targetFramework="net461" /> 
</packages> 

我希望这可以帮助别人。