2016-04-04 26 views
8

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

  1. Utwórz nowy projekt MUI
  2. dodać Caliburn.Micro do projektu
  3. 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> 
    

  4. Tworzenie klasy Bootstrap

    
    public class AppBootstrapper : BootstrapperBase 
    { 
        static AppBootstrapper() 
        { 
        } 
        public AppBootstrapper() 
        { 
         Initialize(); 
        } 
        protected override void OnStartup(object sender, StartupEventArgs e) 
        { 
         DisplayRootViewFor(); 
        } 
    } 
    
  5. 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; 
        } 
    } 
    
  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. 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.

+2

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

Odpowiedz

5

Co do pierwszego pytania o to, dlaczego funkcja nic nie robi, myślę, że może to mieć związek z hierarchią projektu. Korzystanie MUI to okno główne (i tylko) dla jednego z moich zastosowań

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

w mojej hierarchii projektu, mam korzenie projektu (plik CSPROJ), a następnie folder MainWindow.xaml Strony. Wewnątrz folderu moich stron mam moją stronę SettingsPage.xaml. Atrybut source w moim mui: Link tag wskazuje na realną ścieżkę mojego głównego okna do mojego pliku settingsPage.xaml.Następnie MUI załaduje i wyświetli tę ścieżkę w dostawcy treści umieszczonym w twoim głównym oknie za pomocą domyślnego szablonu stylu MUI ModernWindow. Do poruszania się po twoim obszarze nie jest potrzebny żaden dodatkowy kod (dopóki nie będziesz potrzebował skomplikowanej nawigacji w widoku podrzędnym).

Mój plik settingsPage.xaml jest normalną formant użytkownika z siatką o stylu przypisanym do stylu zasobów statycznych ContentRoot, ponieważ zawiera również dodatkowe widoki/strony.

Źródło Mui można znaleźć na GitHub pod numerem Mui GithubLink. Tutaj możesz pobrać przykładowy program, którego kod znajduje się w tym samym repozytorium pod aplikacją Link here for covience.

Nie jestem zaznajomiony z Caliburn.Micro, więc nie jestem pewien, w jaki sposób te dwie są ze sobą połączone, takie jak wymagania Caliburn.Micro do działania. Wiem, w jaki sposób MUI integruje się ze światłem MVVM i wiele przykładów tego znajduje się w Internecie w moich badaniach przed ręką.