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
- ein neues MUI Projekt erstellen
- Fügen Sie die Caliburn.Micro dem Projekt
Ä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>
Erstellen Sie die Bootstrapper-Klasse
public class AppBootstrapper : BootstrapperBase { static AppBootstrapper() { } public AppBootstrapper() { Initialize(); } protected override void OnStartup(object sender, StartupEventArgs e) { DisplayRootViewFor(); } }
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; } }
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()); } }
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.
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