zoukankan      html  css  js  c++  java
  • 从零开始搭建Wpf基础11-实现一个业务菜单

    前言:实现一个与后台交互的菜单。

    第一步:新建项目AIStudio.Wpf.Base_Manage,新建Base_ManageModule.cs,为了prism的导航注册使用。

    public class Base_ManageModule : IModule
    {
        public void OnInitialized(IContainerProvider containerProvider)
        {

        }

        public void RegisterTypes(IContainerRegistry containerRegistry)
        {
            var assembly = Assembly.GetExecutingAssembly();

            foreach (var type in assembly.GetTypes())
            {
                if (type.IsSubclassOf(typeof(UserControl)))
                {
                    containerRegistry.RegisterForNavigation(type, type.FullName);
                }
            }
        }
    }

    新建View和ViewModel,代码太多就步逐个贴出来了。

    第二步:在App.xaml.cs添加如下代码:

    protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
    {
        var mainWindowModule = typeof(MainWindowModule);
        moduleCatalog.AddModule(new ModuleInfo()
        {
            ModuleName = mainWindowModule.Name,
            ModuleType = mainWindowModule.AssemblyQualifiedName,
            InitializationMode = InitializationMode.WhenAvailable
        });

        var base_ManageModule = typeof(Base_ManageModule);
        moduleCatalog.AddModule(new ModuleInfo()
        {
            ModuleName = base_ManageModule.Name,
            ModuleType = base_ManageModule.AssemblyQualifiedName,
            InitializationMode = InitializationMode.WhenAvailable
        });
    }

    第三步:导航后,Title要和获取到的Title保持一致,导航的时候添加传参

     private void Menu(AMenuItem menuItem)
      {
          NavigationParameters paras = new NavigationParameters();
          paras.Add("Title", menuItem.Label);
          _regionManager.RequestNavigate("MainContentRegion", menuItem.WpfCode, NavigationComplete,  paras);
      }

    在底层处理好Title,利用反射将ViewModel的Title赋值上。

    public TabablzControlRegion()
    {
        this.NavigationService.Navigating += NavigationService_Navigating;
    }

    private void NavigationService_Navigating(object sender, RegionNavigationEventArgs e)
    {
        if (e.NavigationContext.Parameters.ContainsKey("Title"))
        {
            var view = this.Views.FirstOrDefault(x => x.GetType().Name == e.Uri.ToString() || x.GetType().FullName == e.Uri.ToString()) as FrameworkElement;
            if (view != null && view.DataContext != null)
            {
                var propertyInfo = view.DataContext.GetType().GetProperty("Title");
                if (propertyInfo != null)
                {
                    propertyInfo.SetValue(view.DataContext, e.NavigationContext.Parameters["Title"]);
                }
            }
        }
    }

    第四步:上述运行后,发现还有DialogHost内的控件会有残影,发现是MetroWindow与DialogHost配合不够好导致的,那么就把主窗体替换下好了。

    <Window  x:Class="AIStudio.Wpf.Client.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:AIStudio.Wpf.Client"
            xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls"
            xmlns:view="clr-namespace:AIStudio.Wpf.Home.Views;assembly=AIStudio.Wpf.Home"
            xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
            xmlns:system="clr-namespace:System;assembly=System.Runtime"
            mc:Ignorable="d"       
            WindowStartupLocation="CenterScreen"
            Title="AIStudio.Wpf.Client" Height="450" Width="800" Style="{StaticResource MaterialDesignWindow}" >
        <Grid>
            <view:MainView/>
        </Grid>
    </Window>

    本章没有详细写,(耐心不够,不适合写博客,早点完结吧,哈哈)大家看下代码就能理解。

    下一章为本基础篇的完结篇。

    源码地址:https://gitee.com/akwkevin/aistudio.-wpf.-client.-stepby-step

    每一章都有自己的Tag,按照链接进去直接下载就是本章内容。

    另外推荐一下我的Wpf客户端框架:https://gitee.com/akwkevin/aistudio.-wpf.-aclient

    作者:竹天笑
    互相学习,提高自己。
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    Practice2_vector_sort_struct
    a demo of vector of STL
    抽象漏洞原则
    不是抽象的漏洞,而是本质复杂性
    2017中国大学生程序设计竞赛
    2017中国大学生程序设计竞赛
    2017中国大学生程序设计竞赛
    2017中国大学生程序设计竞赛
    2017多校第8场 HDU 6134 Battlestation Operational 莫比乌斯反演
    2017多校第5场 HDU 6085 Rikka with Candies bitset
  • 原文地址:https://www.cnblogs.com/akwkevin/p/15171627.html
Copyright © 2011-2022 走看看