2017-10-18 1 views
0

Ich sehe mir die WPF-Beispiele der PrismLibrary speziell an https://github.com/PrismLibrary/Prism-Samples-Wpf/tree/master/6-ViewActivationDeactivation an. Mein Ziel ist es, eine funktionierende Version der ViewActivationDeactivation-Lösung zu erstellen, aber den MefBootstrapper anstelle des UnityBoostrapper zu verwenden, der ursprünglich im Beispiel verwendet wurde.Aktivieren/Deaktivieren von Ansichten in der WPF-App mithilfe von MefBootstrapper löst Exception aus, wenn der Regionsname in xaml gesetzt wird

Ich habe meine Bootstrap Klasse konfiguriert wie diese

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

und das Hauptfenster der Code sieht wie folgt aus:

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

Die Problem, das ich bin vor, dass der Mainwindow nicht initialisiert wird, ist es ein System.Windows.Markup.XamlParseException wirft, wenn die Region innerhalb des Content Die innere Ausnahmemeldung

wird

Aktivierung Fehler beim Versuch zu setzen versuchen, zu erhalten Instanz vom Typ DelayedRegionCreationBehavior, Taste ""

hier die Ausnahme alle Details

System.Windows.Markup.XamlParseException aufgetreten
HResult = -2146233087 Zeilennummer = 12 Zeilenposition = 10 Nachricht = 'Set Eigenschaft' Prism.Regions.RegionManager.RegionName 'hat eine Ausnahme ausgelöst.' Zeilennummer '12' und Zeilenposition '10'. PresentationFramework Stacktrace
Source =: bei System.Windows.Markup.WpfXamlLoader.Load (XamlReader XamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Objekt RootObject, XamlObjectWriterSettings Einstellungen, Uri baseUri) bei System.Windows.Markup.WpfXamlLoader.LoadBaml (XamlReader XamlReader, Boolean skipJournaledProperties, Object RootObject, XamlAccessLevel access, Uri baseUri) bei System.Windows.Markup.XamlReader.LoadBaml (Stream Strom, ParserContext ParserContext, Object Mutter, Boolean closeStream) bei System.Windows.Application.LoadComponent (Objektkomponente Uri resourceLocator) bei DuoApp_ViewNav.MainWindow.InitializeComponent() i n C: \ Benutzer \ ralfaro \ Dokumente \ Visual Studio 2015 \ Projects \ DuoApp_ViewNav \ DuoApp_ViewNav \ MainWindow.xaml: Linie 1
Innerexception: HResult = -2146233088 Message = Aktivierung Fehler beim Versuch Instanz vom Typ DelayedRegionCreationBehavior zu bekommen Taste "" Source = Microsoft.Practices.ServiceLocation Stacktrace: bei Microsoft.Practices.ServiceLocation.ServiceLocatorImplBase.GetInstance (Typ service~~POS=TRUNC, String key) in c: \ Projects \ CommonServiceLocator \ main \ Microsoft.Practices.ServiceLocation \ ServiceLocatorImplBase.cs: Zeile bei Microsoft.Practices.ServiceLocation.ServiceLocatorImplBase.GetInstanceTServic e in c: \ Projekte \ CommonServiceLocator \ main \ Microsoft.Practices.ServiceLocation \ ServiceLocatorImplBase.cs: line bei Prism.Regions.RegionManager.CreateRegion (DependencyObject Element) bei Prism.Regions.RegionManager.OnSetRegionNameCallback (DependencyObject Element, DependencyPropertyChangedEventArgs args) bei System.Windows.DependencyObject.OnPropertyChanged (DependencyPropertyChangedEventArgs e) bei System.Windows.FrameworkElement.OnPropertyChanged (DependencyPropertyChangedEventArgs e) bei System.Windows.DependencyObject.NotifyPropertyChange (DependencyPropertyChangedEventArgs args) bei System.Windows.DependencyObject.UpdateEffectiveValue (ENTRYINDEX ENTRYINDEX, DependencyProperty dp, PropertyMetada ta-Metadaten, EffectiveValueEntry oldEntry, EffectiveValueEntry & newEntry, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, Operationoperation) bei System.Windows.DependencyObject.SetValueCommon (DependencyProperty dp, Objektwert, PropertyMetadata Metadaten, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, Operationoperation, Boolean IsInternal) bei System.Windows.Baml2006.WpfMemberInvoker.SetValue (Objektinstanz Objektwert) bei MS.Internal.Xaml.Runtime.ClrObjectRuntime.SetValue (XamlMember Mitglied, Objekt OBJ, Objektwert) bei MS.Internal.Xaml.Runtime.ClrObjectRuntime.SetValue (Object inst, XamlMember Eigenschaft, Objektwert) Innerexception: HResult = -2146233088 Message = Aktivierung Fehler beim Versuch Instanz vom Typ DelayedRegionCreationBehavior, Taste "" zu bekommen Source = Microsoft.Practices.Prism.MefExtensions Stacktrace: bei Microsoft.Practices.Prism.MefExtensions.MefServiceLocatorAdapter.DoGetInstance (Typ service~~POS=TRUNC, String key) bei Microsoft.Practices.ServiceLocation.ServiceLocatorImplBase.GetInstance (Typ service~~POS=TRUNC, String-Schlüssel) in c: \ Projekte \ CommonServiceLocator \ main \ Microsoft.Practices.ServiceLocation \ ServiceLocat orImplBase.cs: line Innerexception:

Ehrlich gesagt habe ich keine Ahnung, warum diese Ausnahme ausgelöst. Fehle ich etwas, damit das mit dem MefBootstrapper funktioniert?

Antwort

0

Schließlich herausgefunden. Ich verwies fälschlicherweise auf zwei Assemblys mit MefBootstrapper-Implementierungen, Prism.Mef und Prism.MefExtensions. Nach dem Entfernen des Prism.MefExtensions Pakets/Verweises begann die Anwendung ordnungsgemäß zu funktionieren. Mein letzter Fehlerbehebungsschritt, den ich als sehr nützlich und informativ empfand, bestand darin, den Prism-Bibliothekscode lokal auszuführen und die erforderlichen Referenzen von dort hinzuzufügen, sodass ich erkennen konnte, dass die MefExtensions nicht benötigt wurden.

Die aktuelle Version meiner packages.config Datei sieht wie folgt aus:

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

Ich hoffe, das jemand anderes hilft.

Verwandte Themen