2017-10-18 6 views
0

Je regarde les échantillons WPF de PrismLibrary spécifiquement à https://github.com/PrismLibrary/Prism-Samples-Wpf/tree/master/6-ViewActivationDeactivation. Mon but est de créer une version de travail de la solution ViewActivationDeactivation mais en utilisant le MefBootstrapper à la place du UnityBoostrapper qui est utilisé dans l'exemple.Activer/désactiver les vues dans l'application WPF en utilisant MefBootstrapper jette une exception lors de la définition de RegionName dans xaml

J'ai configuré ma classe bootstrapper comme celui-ci

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; 
    } 
} 

et le code de MainWindow ressemble à ceci:

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); 
    } 
} 

Le problème que je suis confronté est que le MainWindow ne parvient pas à initialiser, il jette un System.Windows.Markup.XamlParseException lorsque vous essayez de régler le RegionName dans le ContentControl Le message d'exception interne est

Erreur d'activation est survenue en essayant d'obtenir instance de type DelayedRegionCreationBehavior, touche ""

Voici l'exception détails

System.Windows.Markup.XamlParseException se sont produits
HResult = -2146233087 LineNumber = 12 LinePosition = 10 Message = 'Définir la propriété ' Prism.Regions.RegionManager.RegionName 'a émis une exception.' Numéro de ligne '12' et position de ligne '10'.
Source = PresentationFramework StackTrace: à System.Windows.Markup.WpfXamlLoader.Load (XamlReader XamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, objet RootObject, XamlObjectWriterSettings paramètres, Uri baseURI) à System.Windows.Markup.WpfXamlLoader.LoadBaml (XamlReader XamlReader, skipJournaledProperties booléens, objet RootObject, XamlAccessLevel AccessLevel, Uri baseURI) à System.Windows.Markup.XamlReader.LoadBaml (stream stream, ParserContext parserContext, parent de l'objet, Boolean closeStream) à System.Windows.Application.LoadComponent (Composant d'objet, Uri resourceLocator) at DuoApp_ViewNav.MainWindow.InitializeComponent() i n C: \ Users \ ralfaro \ Documents \ Visual Studio 2015 \ Projects \ DuoApp_ViewNav \ DuoApp_ViewNav \ MainWindow.xaml: ligne 1
InnerException: HResult = -2146233088 message = erreur d'activation est survenue en essayant d'obtenir instance de type DelayedRegionCreationBehavior , touche "" Source = Microsoft.Practices.ServiceLocation StackTrace: à Microsoft.Practices.ServiceLocation.ServiceLocatorImplBase.GetInstance (type serviceType, String key) dans c: \ Projects \ CommonServiceLocator \ principale \ Microsoft.Practices.ServiceLocation \ ServiceLocatorImplBase.cs: ligne à Microsoft.Practices.ServiceLocation.ServiceLocatorImplBase.GetInstanceTServic e dans c: \ Projects \ CommonServiceLocator \ main \ Microsoft.Practices.ServiceLocation \ ServiceLocatorImplBase.cs: ligne 90 à Prism.Regions.RegionManager.CreateRegion (élément DependencyObject) à Prism.Regions.RegionManager.OnSetRegionNameCallback (DependencyObject élément , DependencyPropertyChangedEventArgs args) à System.Windows.DependencyObject.OnPropertyChanged (e) DependencyPropertyChangedEventArgs à System.Windows.FrameworkElement.OnPropertyChanged (DependencyPropertyChangedEventArgs e) à System.Windows.DependencyObject.NotifyPropertyChange (DependencyPropertyChangedEventArgs args) à System.Windows.DependencyObject.UpdateEffectiveValue (ENTRYINDEX ENTRYINDEX, DependencyProperty dp, PropertyMetada métadonnées ta, EffectiveValueEntry oldEntry, EffectiveValueEntry & newEntry, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType OperationType) à System.Windows.DependencyObject.SetValueCommon (DependencyProperty dp, valeur de l'objet, les métadonnées PropertyMetadata, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType OperationType, Boolean isInternal) à System.Windows.Baml2006.WpfMemberInvoker.SetValue (en instance de l'objet, la valeur de l'objet ) à MS.Internal.Xaml.Runtime.ClrObjectRuntime.SetValue (membre XamlMember, objet obj, la valeur de l'objet) à MS.Internal.Xaml.Runtime.ClrObjectRuntime.SetValue (Object inst, propriété XamlMember, la valeur de l'objet) InnerException: HResult = -2146233088 message = erreur d'activation est survenue en essayant d'obtenir instance de type DelayedRegionCreationBehavior, touche "" Source = Microsoft.Practices.Prism.MefExtensions STACKTRACE: à Microsoft.Practices.Prism.MefExtensions.MefServiceLocatorAdapter.DoGetInstance (type serviceType, String key) à Microsoft.Practices.ServiceLocation.ServiceLocatorImplBase.GetInstance (type serviceType, Clé de chaîne) dans c: \ Projects \ CommonServiceLocator \ main \ Microsoft.Practices.ServiceLocation \ ServiceLocat orImplBase.cs: ligne InnerException:

Honnêtement je ne sais pas pourquoi cette exception est levée. Ai-je manqué quelque chose pour que cela fonctionne avec le MefBootstrapper?

Répondre

0

Enfin compris. J'ai référencé par erreur deux assemblys qui ont des implémentations MefBootstrapper, Prism.Mef et Prism.MefExtensions. Après avoir supprimé le package/référence Prism.MefExtensions, l'application a commencé à fonctionner correctement. Ma dernière étape de dépannage, que j'ai trouvée très utile et informative, consistait à exécuter le code de la bibliothèque Prism localement et à ajouter les références requises à partir de là, ce qui m'a permis de reconnaître que les MefExtensions n'étaient pas nécessaires.

La version actuelle de mon fichier packages.config ressemble à ceci:

<?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> 

J'espère que cela aide quelqu'un d'autre.