W naszej firmie jesteśmy przyzwyczajeni do rozwijania naszych aplikacji za pomocą WinForms, Teraz zdecydowaliśmy się przejść na WPF-MVVM z Caliburn.Micro i Modern UI. Chcemy dotrzeć do małej aplikacji, która ma: - 1 Nowoczesne okno - 2 strony wewnątrz tego nowoczesnego okna celem jest posiadanie przycisku wewnątrz tej strony, która nawiguje po oknie nowoczesnym do drugiego strona z parametrami.Jak poprawnie ładować zawartość wewnątrz ModernWindow przy użyciu mvvm
Pracuję próbując zrozumieć, jak to rozwiązać, udało mi się z Windowsem (bez MUI), ale jeśli chodzi o MUI, to naprawdę nie daje mi pożądanego rezultatu.
Dotychczas Wszystko zrobiłem, jest
- Utwórz nowy projekt MUI
- dodać Caliburn.Micro do projektu
Zmiana App.xaml do
<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>
Tworzenie klasy Bootstrap
public class AppBootstrapper : BootstrapperBase { static AppBootstrapper() { } public AppBootstrapper() { Initialize(); } protected override void OnStartup(object sender, StartupEventArgs e) { DisplayRootViewFor(); } }
Utwórz klasę ModernContentLoader
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()); } }
I wreszcie, 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>
i Child1ViewModel.cs
public class Child1ViewModel : Conductor<IScreen> { public void ClickMe() { MessageBox.Show("Hello"); } }
Moje pytanie brzmi, etap 6, dlaczego funkcja nic nie robić? a jeśli moja droga jest zła, czy ktoś może mnie skierować na lepszy sposób?
A jeśli jest to najlepsze podejście, jak mogę nawigować z funkcji ClickMe do innego widoku.
Zdaję sobie sprawę, że nie jest to odpowiedź, której szukasz, ale rzeczywistość przeskakuje z Winforms do Caliburn. Micro + MUI + MVVM bezpośrednio, jest * bardzo złym pomysłem *. Powinieneś najpierw uczyć się każdego z nich niezależnie, a następnie próbować integracji. Są trudne do zrozumienia (nawet jeśli nie wyglądają tak), są koszmarem na początek, kiedy rzucasz wszystkie niewiadome w jeden tygiel. – Maverik