В нашей компании мы используем для разработки наших приложений с использованием WinForms, Теперь мы решили переключиться на WPF-MVVM с помощью Caliburn.Micro и Modern UI. То, что мы пытаемся достичь, состоит в том, чтобы иметь небольшое приложение, которое имеет: - 1 Современное окно - 2 страницы внутри этого современного окна Цель состоит в том, чтобы иметь кнопку внутри этой страницы, которая перемещает Современное окно во вторую страницы с параметрами.Как правильно загрузить контент в ModernWindow с помощью mvvm
Я работаю, пытаясь понять, как это осуществить, мне удалось с помощью Window (без MUI), но когда дело доходит до MUI, это не дает мне того результата, которого мы хотим.
До сих пор, все я сделал, это
- Создать новый проект MUI
- Добавить в Caliburn.Micro к проекту
Изменение App.xaml к
<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>
Создать Bootstrapper Class
public class AppBootstrapper : BootstrapperBase { static AppBootstrapper() { } public AppBootstrapper() { Initialize(); } protected override void OnStartup(object sender, StartupEventArgs e) { DisplayRootViewFor(); } }
Создание 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()); } }
И, наконец, 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>
и Child1ViewModel.cs
public class Child1ViewModel : Conductor<IScreen> { public void ClickMe() { MessageBox.Show("Hello"); } }
Мой вопрос, шаг 6, почему не работает функция ничего? и если мой путь не прав, может ли кто-нибудь направить меня к лучшему пути?
И если это лучший подход, как я могу перейти от функции ClickMe к другому представлению.
Я понимаю, что это не тот ответ, который вы ищете, но реальность прыгает с Winforms на Caliburn.Micro + MUI + MVVM напрямую, это * очень плохая идея *. Сначала вы должны изучить каждого из них самостоятельно, а затем попытаться интегрировать. Они трудны, чтобы понять (даже если они не кажутся такими), это кошмар, с которого можно начать, когда вы бросаете все неизвестные вместе в один плавильный котел. – Maverik