2009-08-02 4 views
0

Ich habe ein kleines Problem mit Regionen in PRISM. Alle Grundlagen Tests funktionieren, aber jetzt möchte ich das folgende XAML mit reinem C# ersetzen:PRISM-RegionManager - Nicht-XAML-Erstellung von ItemsControl-RegionsManager

<UserControl x:Class="CAL.Modules.Simple.Region_Testing.RegionManagerTypes.XAML.ItemsControlRegionAdapterTest" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:cal="clr-namespace:Microsoft.Practices.Composite.Presentation.Regions;assembly=Microsoft.Practices.Composite.Presentation" 
    Height="Auto" Width="Auto"> 
     <ItemsControl cal:RegionManager.RegionName="ItemsControlRegionAdapterTestRegion"/> 
</UserControl> 

Der Code in meinem Test-Klasse ist ziemlich einfach, ich habe die RegionManager zugreifen und einige Testansichten hinzufügen. Wie Sie oben im XAML sehen, passiert jedoch nichts im UserControl, außer dass der RegionManager an das Control angehängt wird. Ich bin sicher, dass dies in dem Code möglich sein muss, die folgenden Zeilen erstrecken, habe ich bereits:

 // MISSING 
     // Creating the UserControl in CODE instead of XAML 


     // Create the UserControl and add it to the main window 
     regionManager.AddToRegion(RegionNames.MainRegion, new ItemsControlRegionAdapterTest()); 

     // Add some views to the region inside the user control 
     var currentTestRegionName = TestingRegionNames.ItemsControlRegionAdapterTestRegion; 
     regionManager.Regions[currentTestRegionName].Add(new BlueView()); 
     regionManager.Regions[currentTestRegionName].Add(new RedView()); 

Vielen Dank für alle Tipps ...

Antwort

0

Versuchen Sie, den XamlReader Ansatz:

private const string xaml = @" 
<UserControl x:Class=""CAL.Modules.Simple.Region_Testing.RegionManagerTypes.XAML.ItemsControlRegionAdapterTest"" 
    xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"" 
    xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml"" 
    xmlns:cal=""clr-namespace:Microsoft.Practices.Composite.Presentation.Regions;assembly=Microsoft.Practices.Composite.Presentation"" 
    Height=""Auto"" Width=""Auto""> 
     <ItemsControl cal:RegionManager.RegionName=""ItemsControlRegionAdapterTestRegion""/> 
</UserControl>"; 

//in some method 
public void RunMethod() 
{ 
    //create object and cast it 
    ItemsControlRegionAdapterTest obj = (ItemsControlRegionAdapterTest) XamlReader.Parse(xaml); 
} 
+0

Ja, es funktioniert, und schöner als ein XAML-Datei (cleaner). Aber sieht immer noch ein bisschen hässlich aus. "Arbeit" Beispiel in einer Antwort hinzugefügt (wenn jemand es braucht). Vielleicht hat jemand eine andere Herangehensweise, aber danke. Zumindest keine XAML-Datei mehr ... –

1

Ok, der XamlReader Approach funktioniert (kleine Korrekturen, siehe Quellcode angehängt) ...

Aber ehrlich gesagt sieht es ein bisschen hässlich aus :-) Wenn jemand weiß, wie man den "regionManager in Code" anhängt, sind Details willkommen. Zunächst werden die Arbeits XAML Leser Linien sind:

 // MISSING 
     // Creating the UserControl in CODE instead of XAML 
     var obj = (UserControl)XamlReader.Parse(@"<UserControl xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"" 
                   xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml"" 
xmlns:cal=""clr-namespace:Microsoft.Practices.Composite.Presentation.Regions;assembly=Microsoft.Practices.Composite.Presentation"" 
Height=""Auto"" Width=""Auto""> 
    <ItemsControl cal:RegionManager.RegionName=""ItemsControlRegionAdapterTestRegion""/></UserControl>"); 

     // Create the UserControl and add it to the main window 
     regionManager.AddToRegion(RegionNames.MainRegion, obj); 

ERHIELT ES !! (Zumindest funktioniert es nicht sicher, ob Best Practice)

 var uC = new UserControl(); 
     var iC = new ItemsControl(); 
     uC.Content = iC; 

     RegionManager.SetRegionName(iC, "ItemsControlRegionAdapterTestRegion"); 

     regionManager.AddToRegion(RegionNames.MainRegion, uC); 

Vielen Dank für alle Hilfe ... Kommentare immer noch gern gesehen ...

+0

Beachten Sie, dass dieser "hässliche" Weg tatsächlich von Microsoft empfohlen wird. Der Code-only-Weg ist noch hässlicher, und wenn Sie möchten, kann ich das auch posten. –

+0

Meinst du, es ist mit komplexeren Beispielen empfohlen, XAML-Reader zu verwenden. Weil ich in dieser (sehr, sehr einfachen) Sache den Codeansatz besser finde .. (war nicht so schwer, musste ihn nur ein paar Mal mit etwas kreativem Input von deiner Seite betrachten :-) –

+0

Das ist der richtige Weg mach das. Beachten Sie, dass die Reihenfolge, in der Sie AddToRegion und SetRegionName ausführen, nicht von Bedeutung ist. Nur ein Hinweis. –