Nella nostra azienda, siamo abituati a sviluppare le nostre applicazioni utilizzando WinForms, Ora abbiamo deciso di passare a WPF-MVVM con Caliburn.Micro e Modern UI. La cosa che stiamo cercando di raggiungere è avere una piccola applicazione che abbia: - 1 finestra moderna - 2 pagine all'interno di quella finestra moderna l'obiettivo è avere un pulsante all'interno di quella pagina che naviga la finestra moderna alla seconda pagina con parametri.Come caricare correttamente i contenuti all'interno di una finestra moderna usando mvvm
Ho lavorato cercando di capire come farlo funzionare, ho avuto successo con Window (senza MUI), ma quando si tratta di MUI, non mi sta dando il risultato che vogliamo.
Finora, Tutto quello che ho fatto, è
- creare un nuovo progetto MUI
- Aggiungere il Caliburn.Micro al progetto
Modificare l'App.xaml a
<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>
Creare la classe di bootstrapper
public class AppBootstrapper : BootstrapperBase { static AppBootstrapper() { } public AppBootstrapper() { Initialize(); } protected override void OnStartup(object sender, StartupEventArgs e) { DisplayRootViewFor(); } }
Creare la ModernContentLoader Classe
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()); } }
E, infine, il 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>
e Child1ViewModel.cs
public class Child1ViewModel : Conductor<IScreen> { public void ClickMe() { MessageBox.Show("Hello"); } }
La mia domanda è, punto 6, perché la funzione non fare nulla? e se la mia strada è sbagliata qualcuno può indirizzarmi verso un modo migliore?
E se è l'approccio migliore, come posso navigare dalla funzione ClickMe a un'altra vista.
Mi rendo conto che questa non è la risposta che si cerca, ma la realtà sta saltando direttamente da Winforms a Caliburn.Micro + MUI + MVVM, è una * pessima idea *. Dovresti imparare ognuno di loro in modo indipendente prima di tentare l'integrazione. Sono difficili da capire (anche se non sembrano così), sono un incubo con cui iniziare quando si gettano tutte le incognite insieme in un melting pot. – Maverik