Wpf 使用 Prism 实战开发Day04

一.菜单导航实现


1.首先创建出所有的页面(View)及对应的页面逻辑处理类(ViewModel)

  1.  IndexView(首页)-----------------IndexViewModel
  2. ToDoView(待办事项)------------ToDoViewModel
  3. MemoView(忘备录)--------------MemoViewModel
  4. SettingsView(设置)--------------SettingsViewModel

注意:创建View时,添加的是用户控件 

2. 在 MainView.xaml 添加内容展示区域 

通俗点理解就是,其他页面的内容需要有控件去展现出来给用户看。然后就用到一个ContentControl  控件来展现内容,并且也需要用到 Prism 框架里面的区域 (并且通过定义一个区域名称来定位到展现的位置)。我是这样理解的。首先这不是教程,是我学习的记录,如果错了,就错了。

  • 例如,在 ContentControl 中定义一个区域名称,并且使用 prism 注册这个区域
<ContentControl prism:RegionManager.RegionName=""/>

 建议:通过一个扩展类来管理定义的一些属性名称

例如:当前定义的区域名称,通过建立一个扩展类来进行管理

 public static class PrismManager
 {
     public static readonly string MainViewRegionName = "MainViewReion";
 }

  • 扩展类定义完成后,需要在使用到的 MainView 页面中,添加命名空间进行使用这个静态扩展类
xmlns:ext="clr-namespace:MyToDo.Extensions"
  1. xmlns: 是引入命名空间固定的写法
  2. ext 是自定义的名称
  3. = 号后面是扩展类所在的命名空间 

  • 最后,在 ContentControl 控件中去引用这个静态类定义的属性
 <ContentControl prism:RegionManager.RegionName="{x:Static ext:PrismManager.MainViewRegionName}"/>

x:Static 是引用静态类型的属性的固定前缀的写法 


 3.进行页面导航注册

  • 在App.xaml.cs中,把页面(View)和 业务处理类(ViewModel) 进行依赖关联并注册进导航容器中

  /// <summary>
  /// 依懒注入的方法
  /// </summary>
  /// <param name="containerRegistry"></param>
  protected override void RegisterTypes(IContainerRegistry containerRegistry)
  {
      containerRegistry.RegisterForNavigation<IndexView, IndexViewModel>();
      containerRegistry.RegisterForNavigation<MemoView, MemoViewModel>();
      containerRegistry.RegisterForNavigation<ToDoView, ToDoViewModel>();
      containerRegistry.RegisterForNavigation<SettingsView, SettingsViewModel>();
  }

 5. 接着在添加导航命令

  • 在MainViewModel.cs 中,添加导航命令。作用是用来驱动整个页面的导航
  • 接着,还需要添加 IRegionManager,通过在Prism 提供的IRegionManager.Regions 来找到应用程序所注册的导航区域名称(就是内容展现区域定义的名称)
  • 最后,通过.出来RequestNavigate 属性,取菜单传过来的命名空间做为导航的目标页面。
 public class MainViewModel: BindableBase
 {
     public MainViewModel(IRegionManager regionManager)
     {
         NavigateCommand = new DelegateCommand<MenuBar>(Navigate);
         this.regionManager = regionManager;
     }

/// <summary>
/// 导航方法
/// </summary>
/// <param name="bar">菜单</param>
private void Navigate(MenuBar bar)
{
    //命名空间为空,不进行导航
    if (bar == null || string.IsNullOrEmpty(bar.NameSpace)) return;

    regionManager.Regions[PrismManager.MainViewRegionName].RequestNavigate(bar.NameSpace);
}
      /// <summary>
      /// 导航命令
      /// </summary>
     public DelegateCommand<MenuBar> NavigateCommand { get; private set; }

 }

6.实现上一步,下一步导航功能

通过添加导航日志 IRegionNavigationJournal 来实现,上一步,下一步的导航功能

  • 修改导航方法,添加导航成功回调函数
 /// <summary>
 /// 导航方法
 /// </summary>
 /// <param name="bar">菜单</param>
 private void Navigate(MenuBar bar)
 {
     //命名空间为空,不进行导航
     if (bar == null || string.IsNullOrEmpty(bar.NameSpace)) return;

     regionManager.Regions[PrismManager.MainViewRegionName].RequestNavigate(bar.NameSpace, back =>
     {

     }); 
 }
  • 添加一个区域导航日志 IRegionNavigationJournal,用来记录导航的结果 ,并且在回调函数中实例化导航日志
 public class MainViewModel: BindableBase
 {
     public MainViewModel(IRegionManager regionManager)
     {
         NavigateCommand = new DelegateCommand<MenuBar>(Navigate);
         this.regionManager = regionManager;
     }

     /// <summary>
     /// 导航方法
     /// </summary>
     /// <param name="bar">菜单</param>
     private void Navigate(MenuBar bar)
     {
         //命名空间为空,不进行导航
         if (bar == null || string.IsNullOrEmpty(bar.NameSpace)) return;

         regionManager.Regions[PrismManager.MainViewRegionName].RequestNavigate(bar.NameSpace, back =>
         {
             journal=back.Context.NavigationService.Journal;      
         }); 
     }
          
     /// <summary>
     /// 导航命令
     /// </summary>
     public DelegateCommand<MenuBar> NavigateCommand { get; private set; }

     private readonly IRegionManager regionManager;
     /// <summary>
     /// 导航日志
     /// </summary>
     private IRegionNavigationJournal journal;

 }
  • 接着,再添加两个命令,绑定前端按钮点击上一步或下一步按钮,并且进行初始化
 public class MainViewModel: BindableBase
 {
     public MainViewModel(IRegionManager regionManager)
     {
         NavigateCommand = new DelegateCommand<MenuBar>(Navigate);
         this.regionManager = regionManager;
         GoBackCommand = new DelegateCommand(() =>
         {
             if(journal!=null && journal.CanGoBack) journal.GoBack();
         });
         GoForwardCommand = new DelegateCommand(() =>
         {
             if (journal != null && journal.CanGoForward) journal.GoForward();
         });
     }

     /// <summary>
     /// 导航方法
     /// </summary>
     /// <param name="bar">菜单</param>
     private void Navigate(MenuBar bar)
     {
         //命名空间为空,不进行导航
         if (bar == null || string.IsNullOrEmpty(bar.NameSpace)) return;

         regionManager.Regions[PrismManager.MainViewRegionName].RequestNavigate(bar.NameSpace, back =>
         {
             journal=back.Context.NavigationService.Journal;      
         }); 
     }
          
     /// <summary>
     /// 导航命令
     /// </summary>
     public DelegateCommand<MenuBar> NavigateCommand { get; private set; }

     /// <summary>
     /// 下一步
     /// </summary>
     public DelegateCommand GoBackCommand { get; private set; }
     /// <summary>
     /// 上一步
     /// </summary>
     public DelegateCommand GoForwardCommand { get; private set; }

     
     private readonly IRegionManager regionManager;
     /// <summary>
     /// 导航日志
     /// </summary>
     private IRegionNavigationJournal journal;
  
 }
  • 最后,在MainView页面的上一步和下一步按钮绑定ViewMode 写好的命令

7.在ListBox中,添加事件行为,作用是,当用户选中子项内容的时候,触发导航的行为。

  • 需要添加行为的命名空间

引入行为命名空间 xmlns:i="http://schemas.microsoft.com/xaml/behaviors"

  •  接着在ListBox 中,添加选中行为事件,来触发导航

<i:Interaction.Triggers>
    <i:EventTrigger EventName="SelectionChanged">
        <i:InvokeCommandAction Command="{Binding NavigateCommand}" CommandParameter="{Binding ElementName=menuBar,Path=SelectedItem}" />
    </i:EventTrigger>
</i:Interaction.Triggers>
  •  Interaction.Triggers  行为触发器
  • EventTrigger 触发的事件
  • EventName 触发事件的名称,这个事件命名,一定是ListBox存在的事件名称,不是随便起的名称
  • InvokeCommandAction 绑定后台要触发的导航命令
  • CommandParameter 绑定当前选中项。例如。这是传过去后台命令的参数

例如,上面是通过选中ListBox Item的子项来触发导航命令

8.优化点击菜单子项的同时关闭左侧菜单

  • 只需要绑定ListBox 的SelectionChanged 选择事件,点击的时候让左侧边框收起即可

//菜单选择事件
menuBar.SelectionChanged += (s, e) =>
{
    drawerHost.IsLeftDrawerOpen = false;
};
  • menuBar  是ListBox 定义的名称
  • drawerHost 是左侧弹框定义的名称

二.源码 

  • MainView.xaml 

<Window x:Class="MyToDo.Views.MainView"
        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:ext="clr-namespace:MyToDo.Extensions"
        xmlns:local="clr-namespace:MyToDo"
        xmlns:prism="http://prismlibrary.com/"
        xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
        prism:ViewModelLocator.AutoWireViewModel="True"
        WindowStyle="None" WindowStartupLocation="CenterScreen" AllowsTransparency="True"
         Style="{StaticResource MaterialDesignWindow}"
        TextElement.Foreground="{DynamicResource MaterialDesignBody}"
        Background="{DynamicResource MaterialDesignPaper}"
        TextElement.FontWeight="Medium"
        TextElement.FontSize="14"
        FontFamily="{materialDesign:MaterialDesignFont}"
        mc:Ignorable="d"
        xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
        Title="MainWindow" Height="768" Width="1280">
    <materialDesign:DialogHost DialogTheme="Inherit"
                           Identifier="RootDialog"
                           SnackbarMessageQueue="{Binding ElementName=MainSnackbar, Path=MessageQueue}">

        <materialDesign:DrawerHost x:Name="drawerHost" IsLeftDrawerOpen="{Binding ElementName=MenuToggleButton, Path=IsChecked}">
            <!--左边菜单-->
            <materialDesign:DrawerHost.LeftDrawerContent>
                <DockPanel MinWidth="220" >
                 
                    <!--头像-->
                    <StackPanel DockPanel.Dock="Top" Margin="0,20">
                        <Image Source="/Images/user.jpg" Width="50" Height="50">
                            <Image.Clip>
                                <EllipseGeometry Center="25,25" RadiusX="25" RadiusY="25" />
                            </Image.Clip>
                        </Image>
                        <TextBlock Text="WPF gg" Margin="0,10" HorizontalAlignment="Center" />
                    </StackPanel>
                    
                    <!--列表-->
                    <ListBox  x:Name="menuBar" ItemContainerStyle="{StaticResource MyListBoxItemStyle}" ItemsSource="{Binding MenuBars}">
                        <i:Interaction.Triggers>
                            <i:EventTrigger EventName="SelectionChanged">
                                <i:InvokeCommandAction Command="{Binding NavigateCommand}" CommandParameter="{Binding ElementName=menuBar,Path=SelectedItem}" />
                            </i:EventTrigger>
                        </i:Interaction.Triggers>
                        <ListBox.ItemTemplate>
                            <DataTemplate>
                                <StackPanel Orientation="Horizontal" Background="Transparent">
                                    <materialDesign:PackIcon Kind="{Binding Icon}" Margin="15,0" />
                                    <TextBlock Text="{Binding Title}" Margin="10,0"/>
                                </StackPanel>
                            </DataTemplate>
                        </ListBox.ItemTemplate>
                    </ListBox>
                    
                    
                </DockPanel>
            </materialDesign:DrawerHost.LeftDrawerContent>

            <DockPanel >
                <!--导航条色块-->
                <materialDesign:ColorZone Padding="16" x:Name="ColorZone"
                                materialDesign:ElevationAssist.Elevation="Dp4"
                                DockPanel.Dock="Top"
                                Mode="PrimaryMid">
                    <DockPanel LastChildFill="False">
                        <!--上左边内容-->
                        <StackPanel Orientation="Horizontal">
                            <ToggleButton x:Name="MenuToggleButton"
                          AutomationProperties.Name="HamburgerToggleButton"
                          IsChecked="False"
                          Style="{StaticResource MaterialDesignHamburgerToggleButton}" />

                            <Button Margin="24,0,0,0"
                    materialDesign:RippleAssist.Feedback="{Binding RelativeSource={RelativeSource Self}, Path=Foreground, Converter={StaticResource BrushRoundConverter}}"
                    Command="{Binding GoForwardCommand}"
                    Content="{materialDesign:PackIcon Kind=ArrowLeft,
                                                      Size=24}"
                    Foreground="{Binding RelativeSource={RelativeSource AncestorType={x:Type FrameworkElement}}, Path=(TextElement.Foreground)}"
                    Style="{StaticResource MaterialDesignToolButton}"
                    ToolTip="Previous Item" />

                            <Button Margin="16,0,0,0"
                    materialDesign:RippleAssist.Feedback="{Binding RelativeSource={RelativeSource Self}, Path=Foreground, Converter={StaticResource BrushRoundConverter}}"
                    Command="{Binding GoBackCommand}"
                    Content="{materialDesign:PackIcon Kind=ArrowRight,
                                                      Size=24}"
                    Foreground="{Binding RelativeSource={RelativeSource AncestorType={x:Type FrameworkElement}}, Path=(TextElement.Foreground)}"
                    Style="{StaticResource MaterialDesignToolButton}"
                    ToolTip="Next Item" />
                            <TextBlock Margin="16,0,0,0"
                             HorizontalAlignment="Center"
                             VerticalAlignment="Center"
                             AutomationProperties.Name="Material Design In XAML Toolkit"
                             FontSize="22"
                             Text="笔记本" />
                        </StackPanel>
                        <!--上右边图标-->
                        <StackPanel DockPanel.Dock="Right" Orientation="Horizontal">
                            <Image Source="/Images/user.jpg" Width="25" Height="25">
                                <Image.Clip>
                                    <EllipseGeometry Center="12.5,12.5" RadiusX="12.5" RadiusY="12.5" />
                                </Image.Clip>
                            </Image>
                            <Button x:Name="btnMin" Style="{StaticResource MaterialDesignFlatMidBgButton}">
                                <materialDesign:PackIcon Kind="MoveResizeVariant" />
                            </Button>
                            <Button x:Name="btnMax" Style="{StaticResource MaterialDesignFlatMidBgButton}">
                                <materialDesign:PackIcon Kind="CardMultipleOutline" />
                            </Button>
                            <Button x:Name="btnClose" Style="{StaticResource MaterialDesignFlatMidBgButton}" Cursor="Hand">
                                <materialDesign:PackIcon Kind="WindowClose" />
                            </Button>
                        </StackPanel>
                    </DockPanel>

                </materialDesign:ColorZone>

                <!--内容展现区域-->
                <ContentControl prism:RegionManager.RegionName="{x:Static ext:PrismManager.MainViewRegionName}"/>
            </DockPanel>
        </materialDesign:DrawerHost>
    </materialDesign:DialogHost>
</Window>
  •  MainView.xaml.cs

/// <summary>
/// MainView.xaml 的交互逻辑
/// </summary>
public partial class MainView : Window
{
    public MainView()
    {
        InitializeComponent();
        //最小化
        btnMin.Click += (s, e) =>
        {
            this.WindowState = WindowState.Minimized;//窗口设置最小
        };
        //最大化
        btnMax.Click += (s, e) =>
        {
            //判断窗口是否是最小化状态
            if (this.WindowState == WindowState.Maximized)
            {
                this.WindowState = WindowState.Normal; //改成正常状态
            }
            else
            {
                this.WindowState = WindowState.Maximized;//最大化
            }
        };
        //关闭
        btnClose.Click += (s, e) =>
        {
            this.Close();
        };
        //鼠标拖动事件
        ColorZone.MouseMove += (s, e) =>
        {
            //如果鼠标在拖动
            if (e.LeftButton == MouseButtonState.Pressed)
            {
                this.DragMove();//让窗口移动
            }
        };

        //导航栏双击事件
        ColorZone.MouseDoubleClick += (s, e) =>
        {
            //双击时,如果是窗口是正常形态,就变成最大化
            if (this.WindowState == WindowState.Normal)
            {
                this.WindowState = WindowState.Maximized;
            }
            else
            {
                this.WindowState = WindowState.Normal;//否则就变成正常的形态
            }
        };
        //菜单选择事件
        menuBar.SelectionChanged += (s, e) =>
        {
            drawerHost.IsLeftDrawerOpen = false;
        };
    }
}
  • MainViewModel

public class MainViewModel: BindableBase
{
    public MainViewModel(IRegionManager regionManager)
    {
        MenuBars=new ObservableCollection<MenuBar>();
        CreateMenuBar();
        NavigateCommand = new DelegateCommand<MenuBar>(Navigate);
        this.regionManager = regionManager;
        GoBackCommand = new DelegateCommand(() =>
        {
            if(journal!=null && journal.CanGoBack) journal.GoBack();
        });
        GoForwardCommand = new DelegateCommand(() =>
        {
            if (journal != null && journal.CanGoForward) journal.GoForward();
        });
    }

    /// <summary>
    /// 导航方法
    /// </summary>
    /// <param name="bar">菜单</param>
    private void Navigate(MenuBar bar)
    {
        //命名空间为空,不进行导航
        if (bar == null || string.IsNullOrEmpty(bar.NameSpace)) return;

        regionManager.Regions[PrismManager.MainViewRegionName].RequestNavigate(bar.NameSpace, back =>
        {
            journal=back.Context.NavigationService.Journal;      
        }); 
    }
         
    /// <summary>
    /// 导航命令
    /// </summary>
    public DelegateCommand<MenuBar> NavigateCommand { get; private set; }

    /// <summary>
    /// 下一步
    /// </summary>
    public DelegateCommand GoBackCommand { get; private set; }
    /// <summary>
    /// 上一步
    /// </summary>
    public DelegateCommand GoForwardCommand { get; private set; }

    private ObservableCollection<MenuBar> menuBars;
    private readonly IRegionManager regionManager;
    /// <summary>
    /// 导航日志
    /// </summary>
    private IRegionNavigationJournal journal;
    public ObservableCollection<MenuBar> MenuBars
    {
        get { return menuBars; }
        set { menuBars = value; RaisePropertyChanged(); }
    }
    void CreateMenuBar()
    {
        MenuBars.Add(new MenuBar() { Icon="Home",Title="首页",NameSpace="IndexView"});
        MenuBars.Add(new MenuBar() { Icon = "NotebookCheckOutline", Title = "待办事项", NameSpace = "ToDoView" });
        MenuBars.Add(new MenuBar() { Icon = "NotebookPlusOutline", Title = "忘备录", NameSpace = "MemoView" });
        MenuBars.Add(new MenuBar() { Icon = "Cog", Title = "设置", NameSpace = "SettingsView" });
    }
}
  • App.xaml.cs
 public partial class App : PrismApplication
 {
     /// <summary>
     /// 创建启动页面
     /// </summary>
     /// <returns></returns>
     protected override Window CreateShell()
     {
        return Container.Resolve<MainView>();
     }
     /// <summary>
     /// 依懒注入的方法
     /// </summary>
     /// <param name="containerRegistry"></param>
     protected override void RegisterTypes(IContainerRegistry containerRegistry)
     {
         containerRegistry.RegisterForNavigation<IndexView, IndexViewModel>();
         containerRegistry.RegisterForNavigation<MemoView, MemoViewModel>();
         containerRegistry.RegisterForNavigation<ToDoView, ToDoViewModel>();
         containerRegistry.RegisterForNavigation<SettingsView, SettingsViewModel>();
     }
 }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/118076.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

防逆流系统中防逆流电表的正确安装位置-安科瑞黄安南

随着光伏行业的发展&#xff0c;部分地区村级变压器及工业用电变压器容量与光伏项目的装机容量处于饱和。电网公司要求对后建的光伏并网系统为不可逆流发电系统&#xff0c;指光伏并网系统所发生的电由本地负载消耗&#xff0c;多余的电不允许通过低压配电变压器向上级电网逆向…

【漏洞复现】Apache_HTTP_2.4.50_路径穿越漏洞(CVE-2021-42013)

感谢互联网提供分享知识与智慧&#xff0c;在法治的社会里&#xff0c;请遵守有关法律法规 文章目录 1.1、漏洞描述1.2、漏洞等级1.3、影响版本1.4、漏洞复现1、基础环境2、漏洞扫描3、漏洞验证方式一 curl方式二 bp抓捕 1.5、修复建议 说明内容漏洞编号CVE-2021-42013漏洞名称…

【GEE】6、在 Google 地球引擎中构建各种遥感指数

1简介 在本模块中&#xff0c;我们将讨论以下概念&#xff1a; 如何在 GEE 中重命名图像的波段。如何使用已有的遥感指数。如何使用波段数学生成自己的遥感指数。 一个田地已经灌溉的年数的卫星图像。灌溉水最可能的来源是奥加拉拉含水层。图片来自科罗拉多州霍利奥克附近。资料…

设计模式之迭代器模式

什么是迭代器模式 迭代器模式&#xff08;Iterator pattern&#xff09;是一种对象行为型设计模式&#xff0c;它提供了一种方法来顺序访问聚合对象中的元素&#xff0c;而又不暴露该对象的内部表示&#xff0c;同时也可以将迭代逻辑与聚合对象的实现分离&#xff0c;增强了代码…

信驰达RF-DG-52PAS CC2652P Zigbee 3.0 USB Dongle烧录指南

一、使用前准备 RF-DG-52PAS是信驰达科技基于美国 TI CC2652P和CP2102为核心设计的Zigbee 3.0 USB Dongle,可烧录 Z-Stack 3.x.0协调器固件&#xff0c;可以直接连接到计算机或树莓派&#xff0c;通过ZHA或 Zigbee2MQTT连接到 Home Assistant或其他开源物联网平台。还可以烧录…

uniapp小程序刮刮乐抽奖

使用canvas画布画出刮刮乐要被刮的图片&#xff0c;使用移动清除画布。 当前代码封装为刮刮乐的组件&#xff1b; vue代码&#xff1a; <template><view class"page" v-if"merchantInfo.cdn_static"><image class"bg" :src&q…

ElasticSearch与Lucene是什么关系?Lucene又是什么?

一. ElasticSearch 与 Lucene 的关系 Elasticsearch&#xff08;ES&#xff09;和Apache Lucene之间有密切的关系&#xff0c;可以总结如下&#xff1a; Elasticsearch构建于Lucene之上&#xff1a;Elasticsearch实际上是一个分布式的、实时的搜索和分析引擎&#xff0c;它构建…

成员变量为动态数据时不可轻易使用

问题描述 业务验收阶段&#xff0c;遇到了一个由于成员变量导致的线程问题 有一个kafka切面&#xff0c;用来处理某些功能在调用前后的发送消息&#xff0c;资产类型type是成员变量定义&#xff1b; 资产1类型推送消息是以zichan1为节点&#xff1b;资产2类型推送消息是以zi…

在现在大环境下如何回到月薪过万的软件测试工程师?

测试工程师这个岗位对于有些人来说&#xff0c;可能月薪过万很容易&#xff0c;可对于有些人来说&#xff0c;仿佛已经达到瓶颈&#xff0c;任凭工作再卖力每月也只是四五千的薪资&#xff0c;月入过万对于这些人来说就是可望不可即&#xff0c;那么这些人怎么才能冲破瓶颈&…

Docker学习——④

文章目录 1、Docker Image&#xff08;镜像&#xff09;2、镜像命令详解2.1 docker rmi2.2 docker save2.3 docker load2.4 docker image inspect2.5 docker history2.6 docker image prune 3、镜像综合实战3.1 离线镜像迁移3.2 镜像存储的压缩与共享 1、Docker Image&#xff…

Flask(Jinja2) 服务端模板注入漏洞(SSTI)

Flask&#xff08;Jinja2&#xff09; 服务端模板注入漏洞(SSTI) 参考 https://www.freebuf.com/articles/web/260504.html 验证漏洞存在 ?name{{7*7}} 回显49说明漏洞存在 vulhub给出的payload: {% for c in [].__class__.__base__.__subclasses__() %} {% if c.__name__…

UE4 Niagara Module Script 初次使用笔记

这里可以创建一个Niagara模块脚本 创建出来长这样 点击号&#xff0c;输出staticmesh&#xff0c;点击它 这样就可以拿到对应的一些模型信息 这里的RandomnTriCoord是模型的坐标信息 根据坐标信息拿到位置信息 最后的Position也是通过Map Set的号&#xff0c;选择Particles的P…

【年底不想背锅!网络工程师必收藏的排障命令大全】

网络故障排除工具是每个网络工程师的必需品。 为了提升我们的工作效率&#xff0c; 不浪费时间&#xff0c;工具的重要性显而易见 特别是每当添加新的设备或网络发生变更时&#xff0c;新的问题就会出现&#xff0c;而且很难快速确定问题出在哪里。每一位网络工程师或从事网…

【MySQL--->索引】

文章目录 [TOC](文章目录) 一、索引概念二、B树与B树1.B树的特点:2.B树的特点:3.为什么使用B树而不使用B树 三、聚簇索引和非聚簇索引四、索引操作1.创建索引2. 删除索引3.全文索引 一、索引概念 mysql的查询的过程是从文件中提取到内存中查询,MySQL启动时会在内存中维护一个b…

基于 NGram 分词,优化 Es 搜索逻辑,并深入理解了 matchPhraseQuery 与 termQuery

基于 NGram 分词&#xff0c;优化 Es 搜索逻辑&#xff0c;并深入理解了 matchPhraseQuery 与 termQuery 前言问题描述排查索引库分词&#xff08;发现问题&#xff09;如何去解决这个问题&#xff1f;IK 分词器NGram 分词器使用替换 NGram 分词器后进行测试matchPhraseQuery 查…

pytorch加载的cifar10数据集,到底有没有经过归一化

pytorch加载cifar10的归一化 pytorch怎么加载cifar10数据集torchvision.datasets.CIFAR10transforms.Normalize()进行归一化到底在哪里起作用&#xff1f;【CIFAR10源码分析】 torchvision.datasets加载的数据集搭配Dataloader使用model.train()和model.eval() pytorch怎么加载…

Webpack的Tree Shaking。它的作用是什么?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

Cube MX 开发高精度电流源跳坑过程/SPI连接ADS1255/1256系列问题总结/STM32 硬件SPI开发过程

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 1.使用STM32F系列开发一款高精度恒流电源&#xff0c;用到了24位高精度采样芯片ADS1255/ADS1256系列。 2.使用时发现很多的坑&#xff0c;详细介绍了每个坑的具体情况和实际的解决办法。 坑1&#xff1a;波特率设置…

使用Java AOP实现面向切面编程

简介 面向切面编程&#xff08;AOP&#xff09;是一种编程思想&#xff0c;它将程序中的关注点分离&#xff0c;使得开发人员可以专注于核心业务逻辑而不必过多关注横切关注点。Java中的AOP可以通过使用AspectJ等框架来实现&#xff0c;本文将介绍如何使用Java AOP实现切面编程…

【MongoDB】索引 - 复合索引

一、准备工作 这里准备一些学生数据 db.students.insertMany([{ _id: 1, name: "张三", age: 20, class: { id: 1, name: "1班" }},{ _id: 2, name: "李四", age: 22, class: { id: 2, name: "2班" }},{ _id: 3, name: "王五…