2016-04-04 6 views
8

В нашей компании мы используем для разработки наших приложений с использованием WinForms, Теперь мы решили переключиться на WPF-MVVM с помощью Caliburn.Micro и Modern UI. То, что мы пытаемся достичь, состоит в том, чтобы иметь небольшое приложение, которое имеет: - 1 Современное окно - 2 страницы внутри этого современного окна Цель состоит в том, чтобы иметь кнопку внутри этой страницы, которая перемещает Современное окно во вторую страницы с параметрами.Как правильно загрузить контент в ModernWindow с помощью mvvm

Я работаю, пытаясь понять, как это осуществить, мне удалось с помощью Window (без MUI), но когда дело доходит до MUI, это не дает мне того результата, которого мы хотим.

До сих пор, все я сделал, это

  1. Создать новый проект MUI
  2. Добавить в Caliburn.Micro к проекту
  3. Изменение 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> 
    

  4. Создать Bootstrapper Class

    
    public class AppBootstrapper : BootstrapperBase 
    { 
        static AppBootstrapper() 
        { 
        } 
        public AppBootstrapper() 
        { 
         Initialize(); 
        } 
        protected override void OnStartup(object sender, StartupEventArgs e) 
        { 
         DisplayRootViewFor(); 
        } 
    } 
    
  5. Создание 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; 
        } 
    } 
    
  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. И, наконец, 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 к другому представлению.

+2

Я понимаю, что это не тот ответ, который вы ищете, но реальность прыгает с Winforms на Caliburn.Micro + MUI + MVVM напрямую, это * очень плохая идея *. Сначала вы должны изучить каждого из них самостоятельно, а затем попытаться интегрировать. Они трудны, чтобы понять (даже если они не кажутся такими), это кошмар, с которого можно начать, когда вы бросаете все неизвестные вместе в один плавильный котел. – Maverik

ответ

5

Что касается вашего первого вопроса о том, почему функция ничего не делает, я думаю, что это может иметь отношение к иерархии вашего проекта. Использование MUI это главное (и единственное) окно для одного из моих приложений

<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> 

в моей иерархии проекта, у меня есть свой корень проекта (CSPROJ файл), MainWindow.xaml затем папку Pages. В папке моих страниц у меня есть SettingsPage.xaml. Атрибут source в теге mui: Link указывает на реальный путь моего главного окна к моему файлу settingsPage.xaml.Затем MUI загрузит и покажет этот путь в поставщике контента, который помещен в ваше основное окно для вас по шаблону стиля по умолчанию для MUI ModernWindow. Дополнительный код не требуется с вашей стороны для навигации (пока вы не захотите добавить сложную навигацию по подвид).

my settingsPage.xaml-файл - это обычный пользовательский элемент управления с сеткой, имеющей стиль, присвоенный статическому ресурсу ContentRoot, так как он также будет содержать дополнительные виды/страницы.

Источник Mui можно найти на GitHub по телефону Mui GithubLink. Здесь вы можете скачать образец программы, код которого находится в том же хранилище в приложении Link here for covience.

Я не знаком с Caliburn.Micro, поэтому я не уверен, как эти два объединяются вместе, например, требования Caliburn.Micro к работе. Я знаю, как MUI интегрируется с подсветкой MVVM, и в моих исследованиях перед этим есть много примеров этого, найденного в Интернете.