zoukankan      html  css  js  c++  java
  • 从零开始搭建Wpf基础5-无限级菜单MVVM实现

    前言:添加菜单控制

    第一步:在MainWindow主窗口中添加一行,放置菜单,菜单项在xaml中编码,MenuItem的Command采用MVVM的绑定方法。

    <Grid>
          <Grid.RowDefinitions>
              <RowDefinition Height="Auto"/>
              <RowDefinition/>
          </Grid.RowDefinitions>
          <Menu x:Name="MenuControl" Background="Transparent">
              <MenuItem Header="菜单">
                  <MenuItem Header="Login" Command="{Binding MenuCommand}" CommandParameter="LoginView" />
                  <MenuItem Header="Introduce" Command="{Binding MenuCommand}" CommandParameter="IntroduceView" />
              </MenuItem>
          </Menu>
          <ContentControl Grid.Row="1" prism:RegionManager.RegionName="MainContentRegion"/>
      </Grid>

    第二步,在MainWIndowViewModel中,添加MenuCommand的命令方法,点击不同的菜单切换不同的界面。

    class MainWindowViewModel : BindableBase
    {
        IContainerExtension _container;
        IRegionManager _regionManager;

        public MainWindowViewModel(IContainerExtension container, IRegionManager regionManager)
        {
            _container = container;
            _regionManager = regionManager;

        }

        private ICommand _menuCommand;
        public ICommand MenuCommand
        {
            get
            {
                return this._menuCommand ?? (this._menuCommand = new DelegateCommand<string>(para => this.Menu(para)));
            }
        }



        private void Menu(string viewname)
        {
            _regionManager.RequestNavigate("MainContentRegion", viewname);
        }
    }

    第三步,菜单在xaml中写死,不够灵活,比如根据不同的用户获取不同的菜单,菜单也用绑定的方法实现。建立一个菜单类,因为菜单是树形结构,所以需要Children嵌套类,实现无限级的菜单。

    public class AMenuItem : BindableBase
    {
        private string _glyph;
        public string Glyph
        {
            get { return _glyph; }
            set
            {
                SetProperty(ref _glyph, value);
            }
        }

        private string _label;
        public string Label
        {
            get { return _label; }
            set
            {
                SetProperty(ref _label, value);
            }
        }

        public string Code { get; set; }//区分点击的菜单
        public int Type { get; set; }//区分菜单还是目录

        private ICommand _command;
        public ICommand Command
        {
            get { return _command; }
            set
            {
                SetProperty(ref _command, value);
            }
        }

        private ObservableCollection<AMenuItem> _children = new ObservableCollection<AMenuItem>();

        public ObservableCollection<AMenuItem> Children
        {
            get { return _children; }
            set
            {
                SetProperty(ref _children, value);
            }
        }

        public void AddChildren(AMenuItem child)
        {
            this.Children.Add(child);
        }
    }

    第四步 MainWindow的菜单部分代码改成:

    <Menu x:Name="MenuControl" ItemsSource="{Binding MenuItems}" ItemContainerStyle="{StaticResource MenuItemStyle}"  Background="Transparent"/>

    还需要改下样式部分

    <!--顶部菜单栏-->
    <HierarchicalDataTemplate DataType="{x:Type model:AMenuItem}" ItemsSource="{Binding Path=Children}">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>

            <TextBlock x:Name="Header" Grid.Column="1" Margin="5,0,0,0"
                            VerticalAlignment="Center"
                            Text="{Binding Label}" />
        </Grid>
    </HierarchicalDataTemplate>
    <!--顶部菜单-->
    <Style x:Key="MenuItemStyle" TargetType="{x:Type MenuItem}" BasedOn="{StaticResource MahApps.Styles.MenuItem}">
        <Setter Property="MenuItem.Command" Value="{Binding Command}"/>
        <Setter Property="MenuItem.CommandParameter" Value="{Binding Code}"/>         
    </Style>

    第五步 在MainWIndowViewModel生成菜单集合

    private ObservableCollection<AMenuItem> _menuItems = new ObservableCollection<AMenuItem>();
    public ObservableCollection<AMenuItem> MenuItems
    {
        get { return _menuItems; }
        set
        {
            SetProperty(ref _menuItems, value);
        }
    }

    private void InitMenu()
    {
        AMenuItem menu = new AMenuItem() { Label = "菜单", Type = 0 };
        MenuItems.Add(menu);

        menu.AddChildren(new AMenuItem() { Label = "Login", Code = "LoginView", Type = 1, Command = new DelegateCommand<string>(para => this.Menu(para)) });
        menu.AddChildren(new AMenuItem() { Label = "Introduce", Code = "IntroduceView", Type = 1, Command = new DelegateCommand<string>(para => this.Menu(para)) });
    }

    好了,运行看效果

    后续:下一章将实现,主界面。

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

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

    作者:竹天笑
    互相学习,提高自己。
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    1 学习wcf 编写简单的WCF服务流程 并发布在IIS上
    通过FormData对象可以组装一组用 [XMLHttpRequest]发送请求的键/值对,它可以更灵活方便的发送表单数据。
    总结下抽象类Abstract和虚方法Virtual(易混点)
    mac VirtualBox虚拟机装CentOS,并配置网络,使其发布的静态网站能访问
    CentOS 7 1810版本不能使用yum 命令
    C# 选取本月周六日方法
    使用Newtonsoft序列化对象,实现深拷贝
    linq to sql 增删改查
    C# 对象对比是否相等 工作笔记
    zabbix server和zabbix agent的安装
  • 原文地址:https://www.cnblogs.com/akwkevin/p/15114473.html
Copyright © 2011-2022 走看看