如何使用mvvm在ModernWindow中正确加载内容

Ahm*_*oud 8 c# wpf mvvm caliburn.micro modern-ui

在我们公司,我们习惯使用WinForms开发应用程序,现在我们决定使用Caliburn.Micro和Modern UI切换到WPF-MVVM.我们想要达到的目标是拥有一个小应用程序: - 1个现代窗口 - 现代窗口内的2个页面的目标是在该页面内有一个按钮,用于将现代窗口导航到带参数的第二个页面.

我一直在努力了解如何解决这个问题,我成功地使用了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>
    
    Run Code Online (Sandbox Code Playgroud)

  4. 创建Bootstrapper类

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

    __CODE__点击此链接

    另外,不要担心静态库的大小.链接器将删除最终可执行文件中的所有不必要信息.请在这里阅读

    TL; DR版本:

    1. 使用清理您的项目__CODE__.此外,选择__CODE__并切换到__CODE__选项卡.单击__CODE__文件夹名称右侧的右箭头,删除__CODE__文件夹,然后重新启动XCode.

    2. 转到__CODE__你的__CODE__=> find __CODE__=> add __CODE__.这将显示导致错误的确切损坏文件(如果仍然发生).如果您再次出现错误,请在此处发布已损坏文件的路径,我们可以从那里开始工作.

    3. 您的错误的原因是您的一个静态库已损坏.您可以删除4.25gb库并再次重建以查看是否存在此问题.它属于你的项目__CODE__.如果错误消失,那可能就是这样.在这种情况下,小心给出lib的名字?

xtr*_*mpb 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>
Run Code Online (Sandbox Code Playgroud)

在我的项目层次结构中,我有我的项目根(CSPROJ文件),MainWindow.xaml然后是Pages文件夹.在我的页面文件夹中,我有我的SettingsPage.xaml.我的mui中的source属性:Link标记指向我的主窗口到settingsPage.xaml文件的实际路径.然后,MUI将通过MUI ModernWindow类默认样式模板加载并显示在您的主窗口中放置的内容提供程序中的该路径.您无需其他代码进行导航(直到您需要复杂的子视图导航).

我的settingsPage.xaml文件是普通用户控件,网格具有分配给ContentRoot静态资源样式的样式,因为它还将包含其他视图/页面.

Mui源可以在Mui GithubLink的 GitHub上找到.在这里,您可以下载示例程序,该代码可以在应用程序链接下的同一存储库中找到,以便更换.

我不熟悉Caliburn.Micro所以我不确定这两者是如何集成在一起的,例如Caliburn.Micro的要求.我知道MUI如何与MVVM光集成,并且在我的研究中有很多在互联网上找到的例子.