2016-04-04 10 views
8

In unserem Unternehmen sind wir gewohnt, unsere Anwendungen mit WinForms zu entwickeln, Jetzt entschieden wir uns, mit Caliburn.Micro und Modern UI zu WPF-MVVM zu wechseln. Das Ding, das wir erreichen wollen, ist eine kleine Anwendung, die hat: - 1 Modern Window - 2 Seiten in diesem modernen Fenster Ziel ist es, eine Schaltfläche innerhalb dieser Seite, die das moderne Fenster auf die zweite navigiert Seite mit Parametern.So laden Sie Inhalte in einem ModernWindow mit mvvm

Ich habe gearbeitet, um zu versuchen, zu verstehen, wie man das ausarbeitet, ich gelang es mit dem Fenster (ohne MUI), aber wenn es um MUI geht, gibt es mir nicht wirklich das Ergebnis, das wir wollen.

Bisher Alles, was ich tat ist

  1. ein neues MUI Projekt erstellen
  2. Fügen Sie die Caliburn.Micro dem Projekt
  3. Ändern der App.xaml zu

    <Application x:Class="MuiWithCaliburn01.App" 
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
         xmlns:local="clr-namespace:MuiWithCaliburn01"> 
    <Application.Resources> 
        <ResourceDictionary> 
         <ResourceDictionary.MergedDictionaries> 
          <ResourceDictionary> 
           <local:AppBootstrapper x:Key="bootstrapper" /> 
           <local:ModernContentLoader x:Key="ModernContentLoader" /> 
          </ResourceDictionary> 
          <ResourceDictionary Source="/FirstFloor.ModernUI;component/Assets/ModernUI.xaml" /> 
          <ResourceDictionary Source="/FirstFloor.ModernUI;component/Assets/ModernUI.Light.xaml"/> 
         </ResourceDictionary.MergedDictionaries> 
        </ResourceDictionary> 
    </Application.Resources> 
    

  4. Erstellen Sie die Bootstrapper-Klasse

    
    public class AppBootstrapper : BootstrapperBase 
    { 
        static AppBootstrapper() 
        { 
        } 
        public AppBootstrapper() 
        { 
         Initialize(); 
        } 
        protected override void OnStartup(object sender, StartupEventArgs e) 
        { 
         DisplayRootViewFor(); 
        } 
    } 
    
  5. Erstellen Sie die ModernContentLoader Klasse

    
    public class ModernContentLoader : DefaultContentLoader 
    { 
        protected override object LoadContent(Uri uri) 
        { 
         var content = base.LoadContent(uri); 
         if (content == null) 
          return null; 
         var vm = Caliburn.Micro.ViewModelLocator.LocateForView(content); 
         if (vm == null) 
          return content; 
         if (content is DependencyObject) 
         { 
          Caliburn.Micro.ViewModelBinder.Bind(vm, content as DependencyObject, null); 
         } 
         return content; 
        } 
    } 
    
  6. ModernWindowView.xaml & ModernWindowViewModel.cs

    
    < mui:ModernWindow x:Class="MuiWithCaliburn01.ModernWindowView" 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:mui="http://firstfloorsoftware.com/ModernUI" 
        ContentLoader="{StaticResource ModernContentLoader}"> 
    < mui:ModernWindow.MenuLinkGroups> 
        < mui:LinkGroupCollection> 
         < mui:LinkGroup DisplayName="Hello"> 
          < mui:LinkGroup.Links> 
           < mui:Link Source="Child1View.xaml" DisplayName="Click me">< /mui:Link> 
          < /mui:LinkGroup.Links> 
         < /mui:LinkGroup> 
        < /mui:LinkGroupCollection> 
    < /mui:ModernWindow.MenuLinkGroups> 
    < /mui:ModernWindow> 
    

     
    class ModernWindowViewModel : Conductor.Collection.OneActive 
    { 
        public ModernWindowViewModel() 
        { 
         //this function is doing nothing in the ModernWindow, but it works great in the Window. 
         ActivateItem(new Child1ViewModel()); 
        } 
    } 
    

  7. Und schließlich die Child1View.xaml

    <UserControl x:Class="MuiWithCaliburn01.Child1View" 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
        xmlns:mui="http://firstfloorsoftware.com/ModernUI" 
        mc:Ignorable="d" 
        xmlns:cal="http://www.caliburnproject.org" 
        xmlns:model="clr-namespace:MuiWithCaliburn01" 
        d:DataContext="{x:Type model:Child1ViewModel}" 
        d:DesignHeight="300" d:DesignWidth="300"> 
        <Grid> 
         <Button cal:Message.Attach="ClickMe" Width="140" Height="50">Hello World</Button> 
        </Grid> 
    </UserControl> 
    

    und Child1ViewModel.cs

    public class Child1ViewModel : Conductor<IScreen> 
    { 
        public void ClickMe() 
        { 
         MessageBox.Show("Hello"); 
        } 
    } 
    

Meine Frage ist, Schritt 6, warum die Funktion nichts tun? und wenn mein Weg falsch ist, kann mich irgendjemand zu einem besseren Weg führen?

Und wenn es der beste Ansatz ist, wie kann ich von der Funktion ClickMe zu einer anderen Ansicht navigieren.

+2

Ich weiß, das ist nicht die Antwort, die Sie suchen, aber die Realität springt von Winforms zu Caliburn.Micro + MUI + MVVM direkt, ist eine * sehr schlechte Idee *. Sie sollten jeden von ihnen zuerst selbstständig lernen und dann die Integration versuchen. Sie sind schwer zu verstehen (auch wenn sie nicht so erscheinen), sie sind ein Albtraum, wenn man alle Unbekannten in einem Schmelztiegel vereint. – Maverik

Antwort

5

Wie für Ihre erste Frage, warum die Funktion nichts tut, denke ich, dass es mit der Hierarchie Ihres Projekts zu tun haben kann. Mit MUI dies ist der Haupt (und einziges) Fenster für eine der Anwendungen

<mui:ModernWindow x:Class="namespace.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:mui="http://firstfloorsoftware.com/ModernUI" 
    Title="Window Title" IsTitleVisible="True" 
    ContentSource="/Pages/Home.xaml" 
    Style="{StaticResource MyModernWindow}"> 

<mui:ModernWindow.TitleLinks> 
    <mui:Link DisplayName="settings" Source="/Pages/SettingsPage.xaml" /> 
</mui:ModernWindow.TitleLinks> 

in meiner Projekthierarchie, habe ich mein Projekt root (Csproj-Datei), MainWindow.xaml dann einer Seite-Ordner. In meinem Seitenordner habe ich meine SettingsPage.xaml. Das Quellattribut in meinem mui: Link-Tag verweist auf den reellen Pfad meines Hauptfensters zu meiner settingsPage.xaml-Datei.MUI lädt und zeigt dann den Pfad im Inhaltsanbieter an, der von der MUI ModernWindow-Klassenstandardvorlagenvorlage in Ihr Hauptfenster gestellt wird. Ihrerseits ist kein zusätzlicher Code erforderlich, um zu navigieren (bis Sie eine komplexe Unteransichtsnavigation wünschen).

Meine settingsPage.xaml-Datei ist ein normales Benutzersteuerelement mit dem Raster, dem der statische ContentRoot-Ressourcenstil einen Stil zugewiesen hat, da dieser zusätzliche Ansichten/Seiten enthält.

Mui-Quelle kann auf GitHub bei Mui GithubLink gefunden werden. Hier können Sie das Beispielprogramm herunterladen, dessen Code sich im selben Repository unter der App Link here for covience befindet.

Ich bin nicht vertraut mit Caliburn.Micro, also bin ich mir nicht sicher, wie die beiden zusammen integrieren, wie die Anforderungen von Caliburn.Micro zu funktionieren. Ich weiß, wie sich MUI in MVVM light integriert und es gibt viele Beispiele dafür, die ich im Internet in meinen Recherchen gefunden habe.