WPF中如何使用区域导航

1.创建一个Prism框架的项目并设计好数据源

User如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace WPF练习17区域导航.Models
{public class User{public int UserId { get; set; }public string UserName { get; set; }public string UserPwd { get; set; }}
}

UserData如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace WPF练习17区域导航.Models
{public static class UserData{public static List<User> Users = new List<User>() {new User(){ UserId=1,UserName="张三1",UserPwd="123456"},new User(){ UserId=2,UserName="张三2",UserPwd="123456"}};}
}

2.设计好MainWindow.XAML页面 并创建四个UserControl的导航页面以及相应的ViewModel然后将视图注册进Ioc容器

MainWindow.XAML如下:

<Window x:Class="WPF练习17区域导航.Views.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:prism="http://prismlibrary.com/"prism:ViewModelLocator.AutoWireViewModel="True"Title="{Binding Title}"Height="350"Width="525"WindowStartupLocation="CenterScreen"><Grid><Grid.RowDefinitions><RowDefinition Height="60" /><RowDefinition /></Grid.RowDefinitions><Grid Background="Blue"><WrapPanel VerticalAlignment="Center"><TextBlock VerticalAlignment="Center"FontSize="30"Foreground="White"Text="XXX管理系统" /><Button Width="50"Margin="10,0,0,0"Command="{Binding BackCommand}"Content="后退" /><Button Width="50"Margin="10,0,0,0"Command="{Binding ForwardCommand}"Content="前进" /></WrapPanel></Grid><Grid Grid.Row="1"><Grid.ColumnDefinitions><ColumnDefinition Width="160" /><ColumnDefinition /></Grid.ColumnDefinitions><StackPanel Background="Green"><Button Height="30"Margin="0,10,0,0"Command="{Binding TogglePage}"CommandParameter="{Binding RelativeSource={RelativeSource Self}}"Content="PageA" /><Button Height="30"Margin="0,10,0,0"Command="{Binding TogglePage}"CommandParameter="{Binding RelativeSource={RelativeSource Self}}"Content="PageB" /><Button Height="30"Margin="0,10,0,0"Command="{Binding TogglePage}"CommandParameter="{Binding RelativeSource={RelativeSource Self}}"Content="PageC" /></StackPanel><Border Grid.Column="1"Padding="10"BorderBrush="Red"BorderThickness="2"><ContentControl prism:RegionManager.RegionName="ContentRegion" /></Border></Grid></Grid>
</Window>

创建四个UserControl的导航页面:

将视图注册进Ioc容器:

3.四个页面设计好以后 写好MainWIndow对应的ViewModel代码

PageA如下:

<UserControl x:Class="WPF练习17区域导航.Views.Pages.PageA"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:local="clr-namespace:WPF练习17区域导航.Views.Pages"mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800"><Grid><Grid.RowDefinitions><RowDefinition Height="50" /><RowDefinition /><RowDefinition Height="30" /></Grid.RowDefinitions><StackPanel VerticalAlignment="Center"><TextBlock Text="查询条件区域" /></StackPanel><DataGrid Grid.Row="1"AutoGenerateColumns="False"IsReadOnly="True"ItemsSource="{Binding Users}"><DataGrid.Columns><DataGridTextColumn Width="*"Binding="{Binding UserId}"Header="编号" /><DataGridTextColumn Width="*"Binding="{Binding UserName}"Header="账号" /><DataGridTextColumn Width="*"Binding="{Binding UserPwd}"Header="密码" /><DataGridTemplateColumn Width="3*"Header="操作"><DataGridTemplateColumn.CellTemplate><DataTemplate><WrapPanel><Button Width="50"Margin="5,0,0,0"Command="{Binding DataContext.EditCommand, RelativeSource={RelativeSource AncestorType=UserControl}}"CommandParameter="{Binding UserId}"Content="编辑" /><Button Width="50"Margin="5,0,0,0"Content="删除" /><Button Width="70"Margin="5,0,0,0"Content="分配权限" /><Button Width="50"Margin="5,0,0,0"Content="详情" /></WrapPanel></DataTemplate></DataGridTemplateColumn.CellTemplate></DataGridTemplateColumn></DataGrid.Columns></DataGrid><StackPanel Grid.Row="2"VerticalAlignment="Center"><TextBlock Text="分页区域" /></StackPanel></Grid>
</UserControl>

PageAViewModel如下:

using Prism.Commands;
using Prism.Mvvm;
using Prism.Regions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using WPF练习17区域导航.Models;namespace WPF练习17区域导航.ViewModels.Pages
{public class PageAViewModel: BindableBase, INavigationAware, IConfirmNavigationRequest{private readonly IRegionManager regionManager;public PageAViewModel(IRegionManager regionManager){this.regionManager = regionManager;}private List<User> users = UserData.Users;public List<User> Users{get { return users; }set { SetProperty(ref users, value); }}public DelegateCommand<object> EditCommand{get{return new DelegateCommand<object>((obj) =>{int userId = (int)obj;// 导航到编辑页面,并且需要向编辑页面传递参数UserIdNavigationParameters parameters = new NavigationParameters{{ "uid", userId }};// 通过NavigationParameters对象向导航传递参数this.regionManager.Regions["ContentRegion"].RequestNavigate("PageAEdit", parameters);});}}#region INavigationAwre// 第一次进入页面不会执行,第2次之后都会进入。public bool IsNavigationTarget(NavigationContext navigationContext){//MessageBox.Show("PageA IsNavigationTarget!");return false;}// 站在当前页面的角度:OnNavigatedFrom离开当前页面public void OnNavigatedFrom(NavigationContext navigationContext){//MessageBox.Show("离开PageA!");}// 站在当前页面的角度:OnNavigatedTo到当前页面public void OnNavigatedTo(NavigationContext navigationContext){//MessageBox.Show("到PageA!");}#endregion#region IConfirmNavigationRequest// 时机:如果从PageA跳转到PageAEdit页面,需要进行导航确认,应该把导航确认的业务逻辑流写到来源页面。// 导航时,确认是否允许导航动作。// navigationContext导航上下文对象。// continuationCallback回调函数。public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback){if (navigationContext.Uri.ToString() == "PageAEdit"){MessageBoxResult mbr = MessageBox.Show("是否允许进入PageAEdit页面?", "询问", MessageBoxButton.YesNo, MessageBoxImage.Question);bool isAllow = false;if (mbr == MessageBoxResult.Yes){isAllow = true;}continuationCallback(isAllow);}else{continuationCallback(true);}}#endregion}
}

在WPF中使用Prism框架时,INavigationAwareIConfirmNavigationRequest是两个重要的接口,它们允许视图或视图模型参与导航过程,提供了对导航行为的细粒度控制。

INavigationAware

INavigationAware接口包含三个方法,用于在导航过程中与视图或视图模型进行交互:

  • bool IsNavigationTarget(NavigationContext navigationContext):当导航到视图或视图模型时,该方法被调用,以确定当前实例是否可以处理导航请求。通常返回true,表示当前视图可以处理导航
  • void OnNavigatedTo(NavigationContext navigationContext):当视图被导航到的时候,该方法被调用。可以用来初始化视图或处理传入的参数。
  • void OnNavigatedFrom(NavigationContext navigationContext):当视图被导航离开时,该方法被调用。可以用来保存状态或清理资源。

IConfirmNavigationRequest

IConfirmNavigationRequest接口继承自INavigationAware,并添加了一个方法ConfirmNavigationRequest,用于在导航发生前与用户交互,以确认或取消导航:

  • void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback):该方法提供了两个参数,一个是当前导航上下文,另一个是一个回调方法。在调用该方法时,可以显示一个确认对话框,根据用户的选择调用回调方法以决定是否继续导航。例如,如果用户选择取消,则导航将被取消。

PageAEdit.XAML如下:

<UserControl x:Class="WPF练习17区域导航.Views.Pages.PageAEdit"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:local="clr-namespace:WPF练习17区域导航.Views.Pages"mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800"><Grid HorizontalAlignment="Center"VerticalAlignment="Center"><StackPanel><WrapPanel Margin="0,10,0,0"><TextBlock Text="账号:" /><TextBox Width="150"Text="{Binding CurrentEditUser.UserName}" /></WrapPanel><WrapPanel Margin="0,10,0,0"><TextBlock Text="密码:" /><TextBox Width="150"Text="{Binding CurrentEditUser.UserPwd}" /></WrapPanel><WrapPanel Margin="0,10,0,0"><Button Width="50"Content="保存" /></WrapPanel><WrapPanel Margin="0,10,0,0"><Button Width="160"Command="{Binding GoOtherEditCommand}"CommandParameter="2"Content="详情页面跳转到其他详情" /></WrapPanel></StackPanel></Grid>
</UserControl>

PageAEditViewModel如下:

using Prism.Commands;
using Prism.Mvvm;
using Prism.Regions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WPF练习17区域导航.Models;namespace WPF练习17区域导航.ViewModels.Pages
{// 在PageAEdit页面接收到UserId才能处理下一步的逻辑。// 一个跳转目标(PageAEdit页面)要想接收传递过来的参数:必须实现INavigationAwarepublic class PageAEditViewModel : BindableBase, INavigationAware{private readonly IRegionManager regionManager;public PageAEditViewModel(IRegionManager regionManager){this.regionManager = regionManager;}private User currentEditUser;public User CurrentEditUser{get { return currentEditUser; }set { SetProperty(ref currentEditUser, value); }}#region INavigationWare// IsNavigationTarget()第一次进入页面不会执行,第2次之后才会进入。// 通过调试,会发现IsNavigationTarget()方法返回true或false达到效果是一样。但是性能不一样。// 如果返回true,说明不会重新创建视图实例,不会重新创建导航上下文,即:IsNavigationTarget()方法中使用的视图实例及上下文会在OnNavigatedTo()方法中共用。// 如果返回false,说明会重新创建视图实例,会重新创建导航上下文,即:IsNavigationTarget()方法中使用的视图实例及上下文和OnNavigatedTo()方法中使用的视图实例及上下文不是同一个实例。/*IsNavigationTarget()方法用来控制视图或者视图模型实例在导航时是否被重用。当你尝试导航到一个新的视图的时候,Prism会检查当前活动的视图或者视图模型的实例,并调用他们的IsNavigationTarget方法,以决定是否可以重用这个实例。如果返回true,Prism框架将不会创建新的视图或者视图模型实例,而是重用当前的实例。这种方式非常适用于那些数据和状态不需要每次都重新加载的视图,可以提高应用程序的响应速度和资源利用率。*/public bool IsNavigationTarget(NavigationContext navigationContext){Console.WriteLine(navigationContext);//MessageBox.Show("PageAEdit IsNavigationTarget!");return true;}// 站在当前页面的角度:OnNavigatedFrom离开当前页面public void OnNavigatedFrom(NavigationContext navigationContext){//MessageBox.Show("离开PageAEdit!");}// 站在当前页面的角度:OnNavigatedTo到当前页面// 拿参数的时机:在进入当前页面时,拿传递的参数最合理。// 如何拿参数?NavigationContext导航的上下文,拿到上下文就可以拿Uri, Parameters, NavigationService 操作API(导航服务)public void OnNavigatedTo(NavigationContext navigationContext){object obj = navigationContext.Parameters["uid"]; // 取传值方式1int uid1 = (int)obj;int uid2 = navigationContext.Parameters.GetValue<int>("uid");//取传值方式2// AsQueryable()转换成IQueryable<T>,由于IQueryable<T>继承IEnumerable<T>接口,从而可以调用LINQ扩展方法。CurrentEditUser = UserData.Users.AsQueryable().Where(u => u.UserId == uid1).FirstOrDefault();//MessageBox.Show("到PageAEdit!");}#endregionpublic DelegateCommand<object> GoOtherEditCommand{get{return new DelegateCommand<object>(obj =>{int uid = Convert.ToInt32(obj);NavigationParameters parameters = new NavigationParameters(){{"uid",uid}};this.regionManager.RequestNavigate("ContentRegion", "PageAEdit", parameters);});}}}
}

PageB如下:

<UserControl x:Class="WPF练习17区域导航.Views.Pages.PageB"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:local="clr-namespace:WPF练习17区域导航.Views.Pages"mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800"><Grid><TextBlock Text="PageB" /></Grid>
</UserControl>

PageBViewModel如下:

using Prism.Mvvm;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace 区域导航.ViewModels.Pages
{public class PageBViewModel : BindableBase{}
}

PageC如下:

<UserControl x:Class="WPF练习17区域导航.Views.Pages.PageC"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:local="clr-namespace:WPF练习17区域导航.Views.Pages"mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800"><Grid><TextBlock Text="PageC" /></Grid>
</UserControl>

PageCViewModel如下:

using Prism.Mvvm;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace WPF练习17区域导航.ViewModels.Pages
{public class PageCViewModel : BindableBase{}
}

4.最后写好MainWindowViewModel代码

using Prism.Commands;
using Prism.Mvvm;
using Prism.Regions;
using System.Windows.Controls;namespace WPF练习17区域导航.ViewModels
{public class MainWindowViewModel : BindableBase{// 导航日志服务,主要负责提供导航日志的管理,如:添加导航日志,根据导航日志可以前进,后退等等。// 添加导航日志的时机,应该在导航跳转成功后,添加导航日志。private IRegionNavigationJournal journal;private readonly IRegionManager regionManager;// 使用依赖注入的把区域管理服务注入当前的VM。public MainWindowViewModel(IRegionManager regionManager, IRegionNavigationJournal journal){this.regionManager = regionManager;this.journal = journal;}private string _title = "Prism Application";public string Title{get { return _title; }set { SetProperty(ref _title, value); }}public DelegateCommand<object> TogglePage{get{return new DelegateCommand<object>(obj =>{Button button = obj as Button;// 导航跳转// 前提:需要把视图先扔到Ioc容器// 1。拿区域管理器(其实是区域给VM提供的一种服务而异)// 2。从区域管理器中拿某个区域// 3。调用区域的API(导航服务)// 参数1:导航的目标视图名称。参数2:导航后(有可能成功,也有可能失败)的回调函数。参数3:导航参数。this.regionManager.Regions["ContentRegion"].RequestNavigate(button.Content.ToString(),NavigationCallback,new NavigationParameters());});}}private void NavigationCallback(NavigationResult navigationResult){// 导航成功//if(navigationResult.Result==true)//if((bool)navigationResult.Result)if (navigationResult.Result.Value == true){// 添加导航日志的时机,应该在导航跳转成功后,添加导航日志。// navigationResult.Context先拿导航上下文。// NavigationService导航服务// Journal日志journal = navigationResult.Context.NavigationService.Journal;}}public DelegateCommand ForwardCommand{get{return new DelegateCommand(() =>{if (journal != null && journal.CanGoForward){journal.GoForward();}});}}public DelegateCommand BackCommand{get{return new DelegateCommand(() =>{if (journal != null && journal.CanGoBack){journal.GoBack();}});}}}
}

5.效果如下:

 

 

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AR眼镜方案_AR智能眼镜阵列/衍射光波导显示方案

在当今AR智能眼镜的发展中&#xff0c;显示和光学组件成为了技术攻坚的主要领域。由于这些组件的高制造难度和成本&#xff0c;其光学显示模块在整个设备的成本中约占40%。 采用光波导技术的AR眼镜显示方案&#xff0c;核心结构通常由光机、波导和耦合器组成。光机内的微型显示…

一文学会docker中搭建kali

一文学会docker中搭建kali 本文环境&#xff1a;部署好docker的ubuntu系统主机一台 直接pull对应的镜像&#xff1a; docker pull kalilinux/kali-rolling 然后通过端口映射&#xff0c;将本地100端口映射到容器的22端口&#xff0c;就可以ssh了 docker run -it -p 100:22…

git上传文件到远程仓库

git上传项目到远程仓库 1. 生成SSH公钥(ssh-keygen),一直回车即可 2. 将公钥复制下来,粘贴至码云仓库 公钥默认地址: C:\Users\Administrator\.ssh3. 克隆项目到本地(复制SSH地址) 4. 上传文件到刚创建的项目(这里取名为test.py) 5. 上传需要做的几个步骤 (1) git add . 添…

STM32 串口输出调试信息

软硬件信息 CubeMX version 6.12.1Keil uVision V5.41.0.0 注意 串口有多种&#xff1a; TTL232485 串口的相关知识&#xff1a; 01-【HAL库】STM32实现串口打印&#xff08;printf方式) &#xff0c; 内含 TTL 和 232 区别。 我把 232 串口连进 STM32 串口助手收到的信息…

【计算机网络】TCP协议特点3

心跳机制 什么是心跳机制 心跳机制是在计算机系统、网络通信和许多其他技术领域广泛应用的一种机制&#xff0c;用于检测两个实体之间的连接是否仍然活跃&#xff0c;或者设备是否还在正常运行。就是每隔一段时间发送一个固定的消息给服务端&#xff0c;服务端回复一个固定…

STM32单片机CAN总线汽车线路通断检测

目录 目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 1.电路图采用Altium Designer进行设计&#xff1a; 2.实物展示图片 三、程序源代码设计 四、获取资料内容 前言 随着汽车电子技术的不断发展&#xff0c;车辆通信接口在汽车电子控…

Easyui ComboBox 数据加载完成之后过滤数据

Easyui ComboBox 数据加载完成之后过滤数据 需求 在ComboBox 下拉框中过滤包含"物联网"三个字的选项 现状 期望 实现方式 使用 combobox 的方法在加载时过滤 loadFilter 方式一&#xff1a;HTML中编写 <input id"enterpriseDepartmentCode" name&…

Oracle19C AWR报告分析之Instance Efficiency Percentages (Target 100%)

Oracle19C AWR报告分析之Instance Efficiency Percentages 一、分析数据二、详细分析2.1 Instance Efficiency Percentages (Target 100%)各项指标及其解释2.2 分析和总结 一、分析数据 二、详细分析 在 Oracle AWR (Automatic Workload Repository) 报告中&#xff0c;每个性能…

【因果分析方法】MATLAB计算Liang-Kleeman信息流

【因果分析方法】MATLAB计算Liang-Kleeman信息流 1 Liang-Kleeman信息流2 MATLAB代码2.1 函数代码2.2 案例参考Liang-Kleeman 信息流(Liang-Kleeman Information Flow)是由 Liang 和 Kleeman 提出的基于信息论的因果分析方法。该方法用于量化变量之间的因果关系,通过计算信息…

DB-GPT系列(四):DB-GPT六大基础应用场景part1

一、基础问答 进入DB-GPT后&#xff0c;再在线对话默认的基础功能就是对话功能。这里我们可以和使用通义千问、文心一言等在线大模型类似的方法&#xff0c; 来和DB-GPT进行对话。 但是值得注意的是&#xff0c;DB-GPT的输出结果是在内置提示词基础之上进行的回答&#xff0c…

电子工牌独立双通道定向拾音方案(有视频演示)

现在一些行业的客服人员在面对客户都要求使用电子工牌分别记录客服和顾客的声音,我们利用双麦克风阵列双波束拾音的方案设计了一个电子工牌方案.可以有效分别记录客服和顾客的声音. 方案思路: 我们采用了一个双麦阵列波束拾音的模块A-59,此模块可以利用2个麦克风组成阵列进行双…

【2025最新计算机毕业设计】基于SpringBoot+Vue电脑在线装机指南教程网站【源码+文档】

作者简介&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流。✌ 主要内容&#xff1a;&#x1f31f;Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能…

【包教包会】CocosCreator3.x框架——带翻页特效的场景切换

一、效果演示 二、如何获取 1、https://gitee.com/szrpf/TurnPage 2、解压&#xff0c;导入cocos creator&#xff08;版本3.8.2&#xff09;&#xff0c;可以直接运行Demo演示 三、算法思路 1、单场景 页面预制体 通过loadScene来切换页面&#xff0c;无法实现页面特效。…

帽子矩阵--记录

帽子矩阵&#xff08;Hat Matrix&#xff09;并不是由某一位具体的科学家单独发明的&#xff0c;而是逐渐在统计学和线性代数的发展过程中形成的。帽子矩阵的概念最早出现在20世纪初的统计学文献中&#xff0c;尤其是在回归分析的研究中得到了广泛应用。然而&#xff0c;具体是…

opencv kdtree pcl kdtree 效率对比

由于项目中以一个环节需要使用kdtree ,对性能要求比较严苛&#xff0c;所以看看那个kdtree效率高一些。对比了opencv和pcl。 #include <array> #include <deque> #include <fstream> #include <opencv2/highgui.hpp> #include <opencv2/imgproc.hpp…

NodeJS 百度智能云文本转语音(实测)

现在文本转语音的技术已经非常完善了&#xff0c;尽管网络上有许多免费的工具&#xff0c;还是测试了专业的服务&#xff0c;选择了百度的TTS服务。 于是&#xff0c;在百度智能云注册和开通了文本转语音的服务&#xff0c;尝试使用NodeJS 实现文本转语音服务。但是百度的文档实…

关于在Reverse函数中不能使用L=s而是*L=*s的原因分析

完整代码地址&#xff1a; https://blog.csdn.net/2301_76819732/article/details/143807340?spm1001.2014.3001.5502 如果使用Ls; 的话&#xff0c;当输出结果时&#xff0c;会发现内容为空。 我感到很奇怪&#xff0c;按照我的设想&#xff0c;Ls;会把s指向的地址赋给L。 但…

麒麟系统下docker搭建jenkins

首先我们需要创建宿主机挂载路径&#xff0c;我这里放在本地的/data/henkins/home,然后赋予权限&#xff0c;命令如下&#xff1a; mkdir -p /data/jenkins/home chown -R 1000:1000 /data/jenkins/home chmod -R 777 /data/jenkins/homedocker run -d --restart …

Docker部署Kafka SASL_SSL认证,并集成到Spring Boot

1&#xff0c;创建证书和密钥 需要openssl环境&#xff0c;如果是Window下&#xff0c;下载openssl Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions 还需要keytool环境&#xff0c;此环境是在jdk环境下 本案例所使用的账号密码均为&#xff1a; ka…

CSS基础知识04

文本溢出通常是指在限定的空间内不能容纳所输入的文字&#xff0c;导致文字超出了容器的边界 一、文本溢出 1.1.css属性处理 所用到的属性 属性属性值overflowvisible&#xff1a;默认值&#xff0c;内容不会被修剪&#xff0c;会呈现在元素框之外。hidden&#xff1a;内容会…