当前位置: 首页 > news >正文

基于.NET6的WPF基础总结(上)

目录

一.常用属性介绍

二、 程序退出方式

三、布局样式

3.1 Panel的附加属性ZIndex

3.2 Grid(网格)布局

3.3 UniformGrid(均分布局)

3.4 StackPanel(堆积面板)

3.5 WrapPanel(换行面板) 

3.6  DockPanel(停靠面板)

3.7 Canvas(画布布局) 

 3.8 个性化Border

3.9  GridSplitter(分割窗口)

 四、内容控件

4.1 Control类

 4.2 Button按钮

 4.3 CheckBox复选框

 4.4 RadioButton单选框

 4.5 RepeatButton重复按钮

 4.6 Label控件

4.6.1  Label直接显示文本

4.6.2 label和访问修饰符  

 4.6.3 使用控件作为Label的内容

4.7  TextBox

4.8 PasswordBox密码框

4.9 RichTextBox富文本控件

  4.9.1 获取富文本内容

4.9.2 动态创建富文本内容

 4.9.3 加载文件内容到富文本

4.10 ToolTip提示工具

4.10.1 自定义ToolTip内容

 4.11 Popup弹出窗口

 4.12 Image图片

4.12.1 圆形图片

 4.13 GroupBox分组容器

 4.13.1 基本使用

 4.13.2 自定义header属性

4.14 ScrollViewer 视图滚动控件

4.15 Slider 滑块

4.16 ProgressBar进度条

4.17 Calendar日历控件

4.18 DatePicker日期选择控件


一.常用属性介绍

  •    Icon: 指定窗口的图标

  •  Title: 窗口标题

  •  WindowStyle:控制界面边框样式
  1. None-无边框   (窗口无法拖动)
  2.  SingleBorderWindow-单边框(默认)
  3. ThreeDBorderWindow-3D边框 
  4. ToolWindow-工具箱窗口(只有标题和删除界面图标)
  • ResizeMode:指定窗口大小调节样式
  1. NoResize:不能调节、并且没有窗口最大最小按钮
  2. CanMinimize:不能调节,有最小化按钮
  3. CanResize:可调节(默认)
  4. CanResizeWithGrip: 可根据网格调节
  • Topmost: 调节窗口前后顺序,为true时窗口位于最前,都为true时根据顺序决定
  • Height、Width、MaxHeight、MaxWidth:高度、宽度、最大高度、最大宽度
  • SizeToContent:表示窗体大小决定方式
  1. Manual:手工决定(可以自由改变)
  2. Width:宽度决定
  3. Height:高度决定
  4. WidthAndHeight:内容决定
  • Visibility:窗口可见性
  1. Visible:可见
  2. Hidden:隐藏
  3. Collapsed:折叠
  • WindowState: 窗口状态
  1. Normal:正常
  2. Maximized:最大化
  3. Minimized:最小化
  • WindowStartupLocation:窗口启动时位置
  1. CenterScreen:正中间

二、 程序退出方式

  • close():关闭当前窗口
private void Button_Close(object sender, RoutedEventArgs e)
{this.Close();
}
  • Application.Current.Shutdown():关闭UI,但后台进程没有关闭,只到所有后台进程关闭才关闭
private void Button_Exit(object sender, RoutedEventArgs e)
{Application.Current.Shutdown();
}
  •  Environment.Exit(0):强制退出(不会执行finally,但是会进行资源清理)
private void Button_Exit(object sender, RoutedEventArgs e)
{Environment.Exit(0);
}
  •  Process.GetCurrentProcess().Kill():强制退出(不会进行资源清理)
private void Button_Exit(object sender, RoutedEventArgs e)
{Process.GetCurrentProcess().Kill();
}

三、布局样式

3.1 Panel的附加属性ZIndex

        当我们在Grid中定义两个Button的时候,我们可以看到只会显示出按钮2,因为两个按钮重叠在了一起,那么如果我们要自由选择显示哪一个按钮改怎么实现呢?

 我们在Button中加上Panel的附加属性ZIndex后,就可以根据值的大小选择需要显示的内容,比如下面的代码展示的效果则是按钮1被显示

<Grid><Button Panel.ZIndex="1" Content="按钮1" Height="30" Width="200" /><Button Panel.ZIndex="0" Content="按钮2" Height="30" Width="200" />
</Grid>

3.2 Grid(网格)布局

  • 定义行和列
   <Grid ShowGridLines="True"><!--两行--><Grid.RowDefinitions><RowDefinition /><RowDefinition /></Grid.RowDefinitions><!--两列--><Grid.ColumnDefinitions><ColumnDefinition /><ColumnDefinition /></Grid.ColumnDefinitions><!--不写默认是第一行 or 第一列--><TextBlock Text="文本1" /><!--Grid.Row: 哪一行 Grid.Column:那一列--><TextBlock Grid.Row="1" Grid.Column="0" Text="文本2" /><TextBlock Grid.Row="0" Grid.Column="1" Text="文本3" /><TextBlock Grid.Row="1" Grid.Column="1" Text="文本4" /></Grid>

  •  合并行和合并列
<Grid ShowGridLines="True"><!--两行--><Grid.RowDefinitions><RowDefinition /><RowDefinition /></Grid.RowDefinitions><!--两列--><Grid.ColumnDefinitions><ColumnDefinition /><ColumnDefinition /></Grid.ColumnDefinitions><!--Grid.ColumnSpan:合并列  Grid.RowSpan:合并行--><TextBlock Grid.ColumnSpan="2" Text="合并列" VerticalAlignment="Center" HorizontalAlignment="Center" /><TextBlock Grid.RowSpan="2" Text="合并行" VerticalAlignment="Center" HorizontalAlignment="Center" />
</Grid>

  • 设置行和列高度的几种方式 

        1. 给具体的值

<Grid.RowDefinitions><RowDefinition Height="120" /><RowDefinition />
</Grid.RowDefinitions>

        2. 根据内容大小自动变换

<Grid.RowDefinitions><RowDefinition Height="Auto" /><RowDefinition />
</Grid.RowDefinitions>

        3. 设置比例

如下表示将整个网格设置为8等份,第一行占3份,第二行占五份

 <Grid.RowDefinitions><RowDefinition Height="3*" /><RowDefinition Height="5*" /></Grid.RowDefinitions>

3.3 UniformGrid(均分布局)

        UniformGrid与Grid网格布局十分相似,只是UniformGrid的每个单元格面积都是相等的,单元格会平分整个UniformGrid。

  • 定义一个两行两列的单元格

        定义方式特别简单,只需要在UniformGrid中设置Rows和Columns即可

  •  FirstColumn属性的使用

        FirstColumn代表第一行我要空多少格,被挤掉的格子会在布局外部显示,但是运行项目的时候是看不到的

3.4 StackPanel(堆积面板)

        StackPanel用于水平或者垂直堆叠子元素

<StackPanel><Button Content="button01" /><Button Content="button01" /><Button Content="button01" /><Button Content="button01" /><Button Content="button01" />
</StackPanel>

        设置Orientation="Horizontal"后

3.5 WrapPanel(换行面板) 

        当一行或者一列内容放不下时,自动切换到另一行或另一列,提供了三个参数:Orientation-设置排列方式,ItemWidth-设置子项宽度,ItemHeight-设置子项高度

3.6  DockPanel(停靠面板)

3.7 Canvas(画布布局) 

 3.8 个性化Border

<Canvas><!--BorderThickness:边框厚度,可以设置为BorderThickness="左,上,右,下" BorderBrush:边框颜色 CornerRadius:边框圆角--><Border Canvas.Left="20" Canvas.Top="20" BorderThickness="1" Width="100" Height="30" BorderBrush="red"><TextBlock Text="button" VerticalAlignment="Center" HorizontalAlignment="Center" /></Border><Border Canvas.Left="20" Canvas.Top="80" BorderThickness="1" Width="100" Height="30" BorderBrush="Blue" CornerRadius="10" Background="Coral"><TextBlock Text="button" VerticalAlignment="Center" HorizontalAlignment="Center" /></Border><!--需要注意,设置圆的时候长和宽需要一样,并且CornerRadius >= Width/2 or Height/2 --><Border Canvas.Left="20" Canvas.Top="150" BorderThickness="1" Width="100" Height="100"BorderBrush="Green" Background="Yellow" CornerRadius="50"><TextBlock Text="button" VerticalAlignment="Center" HorizontalAlignment="Center" /></Border>
</Canvas>

3.9  GridSplitter(分割窗口)

        GridSplitter用于分割窗口的布局,可以通过鼠标实现左右或者上下的拖动

使用注意事项:

  1. 该属性必须在Grid布局中使用。
  2. 如果要实现左右拖动改变窗口的大小需要设置HorizontalAlignment="Center";
  3. 如果要实现上下拖动改变窗口的大小需要设置VerticalAlignment="Center";
  4. 默认是实时查看改变大小,当设置ShowsPreview="True"时,鼠标取消拖动后才会显示。
<Grid><Grid.ColumnDefinitions><ColumnDefinition /><ColumnDefinition Width="Auto" /><ColumnDefinition /></Grid.ColumnDefinitions><Border Background="Aqua"><!--TextWrapping="Wrap": 自动换行--><TextBlock TextWrapping="Wrap">1111111111111111111111111111111111111111111111</TextBlock></Border><GridSplitter Grid.Column="1" Width="5" HorizontalAlignment="Center" ShowsPreview="True" /><Border Grid.Column="2" Background="Yellow"><TextBlock TextWrapping="Wrap">2222222222222222222222222222222222222222222222222222222</TextBlock></Border>
</Grid>

 四、内容控件

4.1 Control类

        Control类是很多控件的基类,而内容控件与布局控件的不同在于布局控件专注于界面设计,内容控件专注于数据。

        Control在界面上不会有任何的显示,但是Control提供了一个控件模板Control.Template,几乎所有子类对Control.Template都进行了各自的实现,所以只有继承了Control的子类才会在界面上显示。

<Control><Control.Template><ControlTemplate TargetType="Control"><Border Width="200" Height="200" Background="Yellow" CornerRadius="100"><TextBlock Text="button" VerticalAlignment="Center" HorizontalAlignment="Center"></TextBlock></Border></ControlTemplate></Control.Template>
</Control>

 4.2 Button按钮

Button按钮自带的有三个属性:

  1. IsDefault:表示该Button是一个默认按钮,可以直接通过Enter键调用
  2. IsCancel:表示该Button是一个取消按钮,可以通过Esc键直接调用
  3. IsDefaulted:表示是否在用户按下Enter后才激活的按钮

 Button自定义样式:

<Canvas><Button Width="120" Height="30" Content="圆角按钮" Canvas.Left="50" Canvas.Top="50"><Button.Template><ControlTemplate TargetType="Button"><!--TemplateBinding BorderBrush: 获取边框默认的颜色--><Border CornerRadius="15" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="1" Background="Yellow"><Grid><Grid.ColumnDefinitions><ColumnDefinition Width="Auto" /><ColumnDefinition /></Grid.ColumnDefinitions><Image Source="Images/csharp.png" Width="60" Height="20" /><!--ContentPresenter:自动获取Button中content的值--><ContentPresenter Grid.Column="1" VerticalAlignment="Center" HorizontalAlignment="Center" /></Grid></Border></ControlTemplate></Button.Template></Button>
</Canvas>

 4.3 CheckBox复选框

        我们在StackPanel布局中定义三个复选框,为每个复选框绑定OnCheck检查事件,判断该复选框是被被选择,然后定义一个Button,绑定事件Show

<StackPanel x:Name="Select"><TextBlock Text="你知道的编程语言:" Margin="5,5,0,0" /><CheckBox Content="C语言" Checked="OnCheck" Margin="5,5,0,0" /><CheckBox Content="C++语言" Checked="OnCheck" Margin="5,5,0,0" /><CheckBox Content="C#语言" Checked="OnCheck" Margin="5,5,0,0" /><Button Content="查看选择" Width="100" HorizontalAlignment="Left" Margin="5,5,0,0" Click="Show" />
</StackPanel>
private void Show(object sender, RoutedEventArgs e)
{StringBuilder show = new StringBuilder();// 遍历Select下的所有子控件,Select是我在xaml中给Pannel布局定义的名字foreach (var item in Select.Children){if (item is CheckBox){// 判断是否选中if ((item as CheckBox).IsChecked == true){show.Append((item as CheckBox).Content + " ");}}}if (show.Length > 0){MessageBox.Show(show.ToString());}
}private void OnCheck(object sender, RoutedEventArgs e)
{int total = 0;foreach (var item in Select.Children){if (item is CheckBox){total += (item as CheckBox).IsChecked == true? 1 : 0;}}// 最多选择两个if (total > 2){// sender: 是当前选中的CheckBoxvar cbx = sender as CheckBox;if (cbx.IsChecked == true) // 判断是否是选中状态{cbx.IsChecked = false;MessageBox.Show("最多只能选两个");}}
}

 4.4 RadioButton单选框

<StackPanel><StackPanel Orientation="Horizontal" x:Name="Select"><TextBlock Text="性别" Margin="5,0,0,0" /><!--GroupName用于对单选框进行分组--><RadioButton Content="男" GroupName="sex" Margin="10,0,0,0" /><RadioButton Content="女" GroupName="sex" Margin="10,0,0,0" /></StackPanel><Button Content="查看" Width="100" HorizontalAlignment="Left" Margin="5,20,0,0" Click="Show" />
</StackPanel>
private void Show(object sender, RoutedEventArgs e)
{foreach (var sex in Select.Children){if (sex is RadioButton { IsChecked: true } str){MessageBox.Show(str.Content.ToString());}}
}

 4.5 RepeatButton重复按钮

         这个按钮事件是当我们按下鼠标后会一直重复执行,直到我们松开鼠标键,其中具有两个重要的属性:

  • Delay:点击后隔多久开始重复执行
  • Interval:重复执行函数的间隔时间

注意:想要打开控制台查看输出效果需要设置:鼠标右键点击你的解决方案,选择【属性】--> 输出类型修改为控制台应用程序

<Grid><RepeatButton Width="50" Height="30" Content="button" Click="repeatButton" Delay="3000" Interval="2000" />
</Grid>
private int total = 0;
private void repeatButton(object sender, RoutedEventArgs e)
{Console.WriteLine($"点击了{++total}次,当前时间:{DateTime.Now}");
}

 4.6 Label控件

4.6.1  Label直接显示文本

        当我们在Label中添加Content时,Label实际上会在内部创建一个TextBlock来显示我们的内容,但是Label会默认为其加上边距

<StackPanel><Label Content="hello" />
</StackPanel>

4.6.2 label和访问修饰符  

        当我们设置了访问修饰符后,程序运行时我们按住【Alt】键,被我们修饰的子元符会高亮显示,通过【Alt】+"所设置的字符"可以将焦点切换到对应的Label中。

<StackPanel><!--_后面的字符就是被我们修饰的字符,可以放在任何字符的前面--><Label Margin="20,0,0,0" Content="_Name" Target="{Binding ElementName=txtName}" /><TextBox x:Name="txtName" Margin="20,0,50,0" /><Label Margin="20,0,0,0" Content="S_ex" Target="{Binding ElementName=txtSex}" /><TextBox x:Name="txtSex" Margin="20,0,50,0" />
</StackPanel>

        此时运行项目,点击【Alt】,会将我们修饰的字符通过下划线的方式进行显示,如果我们再按“e”,焦点会在Sex中。

 4.6.3 使用控件作为Label的内容

<StackPanel><!--Binding ElementName=txtName:绑定需要被聚焦的文本框--><Label Target="{Binding ElementName=txtName}"><StackPanel Orientation="Horizontal" Margin="50,0"><Image Source="Images/csharp.png" Width="20" Height="20" /><!--AccessText才可以定义访问键--><AccessText Text="_CSharp" VerticalAlignment="Center" /></StackPanel></Label><TextBox x:Name="txtName" Margin="50,0" />
</StackPanel>

4.7  TextBox

        在TextBox中具有许多的属性,下面我列举一些比较常用的

MinLines最小可见行数
MaxLines最大可见行数
Text文本内容
CharacterCasing是否转换成大小写
VerticalScrollBarVisibility是否显示拉条
MaxLength一行的最大字符长度
TextAlignment设置文本水平方向位置
VerticalContentAlignment设置文本垂直方向位置
TextWrapping是否自动换行

4.8 PasswordBox密码框

  • PasswordChar:改变密码框中内容默认显示符号
  • PasswordChanged: 密码改变时执行事件
<StackPanel Margin="20"><PasswordBox />
</StackPanel>

4.9 RichTextBox富文本控件

        RichTextBox可用于显示,输入和操作格式文本。可以实现TextBox的全部功能外,还提供了富文本的显示功能,同时我们可以对文本内容进行编辑。

需要注意:FlowDocumentFlowDocument RichTextBoxRichTextBox唯一支持的子元素是FlowDocument RichTextBox

<StackPanel><RichTextBox x:Name="content"><FlowDocument><Paragraph><Run>Paragraph 1</Run></Paragraph><Paragraph><Run>Paragraph 2</Run></Paragraph><Paragraph><Run>Paragraph 3</Run></Paragraph></FlowDocument></RichTextBox>
</StackPanel>

  4.9.1 获取富文本内容

        给RichTextBox设置Name,通过button可以获取富文本的内容

private void getContent(object sender, RoutedEventArgs e)
{// 获取文本框内容,content是我们给RichTextBox设置的NameTextRange tr = new TextRange(content.Document.ContentStart, content.Document.ContentEnd);MessageBox.Show(tr.Text);
}

4.9.2 动态创建富文本内容

<StackPanel><RichTextBox x:Name="content"></RichTextBox>
</StackPanel>
public partial class MainWindow : Window
{public MainWindow(){InitializeComponent();// 创建FlowDocument对象FlowDocument flowDocument = new FlowDocument();content.Document = flowDocument;// 创建段落Paragraph paragraph = new Paragraph();paragraph.Foreground = Brushes.Blue;paragraph.Inlines.Add("hello");Paragraph paragraph2 = new Paragraph();paragraph2.Foreground = Brushes.Green;paragraph2.Inlines.Add("world");// 将段落添加到文档中flowDocument.Blocks.Add(paragraph);flowDocument.Blocks.Add(paragraph2);}
}

 4.9.3 加载文件内容到富文本

        可以设置一个Button,然后给Button绑定事件,可以实现将文件中的内容显示出来

private void Upload(object sender, RoutedEventArgs e)
{OpenFileDialog file = new OpenFileDialog();file.Filter = "Text files (*.txt)|*.txt|All files (*.*)|*.*";if (file.ShowDialog() == true){TextRange txt = new TextRange(content.Document.ContentStart, content.Document.ContentEnd);using var stream = new FileStream(file.FileName, FileMode.Open, FileAccess.Read);txt.Load(stream, DataFormats.Text);}
}

4.10 ToolTip提示工具

        ToolTip可以显示所有 任何类型,比如图像,字符, 其他控件等  

当我们将鼠标放在Button上时,会显示出设定好的文字“hello” 

<StackPanel><Button Content="鼠标放过来" ToolTip="hello" />
</StackPanel>

4.10.1 自定义ToolTip内容

<StackPanel><Button Width="100" Content="鼠标放过来"><Button.ToolTip><StackPanel><TextBlock>hello</TextBlock><Border Width="100" Height="100"><Image Source="Images/csharp.png" /></Border></StackPanel></Button.ToolTip></Button>
</StackPanel>

 4.11 Popup弹出窗口

AllowsTransparency控件是否包含透明内容
PopupAnimation控件打开或关闭时的动画效果。None:没有效果;Fade:逐渐显示或淡出;Slide:向上向下划入;Scroll:滚动效果
PlacementRectangle弹窗打开的位置
PlacementTarget在那个控件身边打开
StaysOpen默认为true,表示弹窗打开后,如果失去焦点是否继续显示
IsOpen设置弹窗是否显示

小案例如下:

<StackPanel><TextBox x:Name="Menu" Width="100" Margin="0,20" GotFocus="got" LostFocus="lost" /><Popup x:Name="myPopup" PlacementTarget="{Binding ElementName=Menu}"Width="{Binding ElementName=Menu,Path=ActualWidth}" ><ListBox x:Name="list" SelectionChanged="ListBoxSelect"><ListBoxItem Content="item1" /><ListBoxItem Content="item2" /><ListBoxItem Content="item3" /><ListBoxItem Content="item4" /></ListBox></Popup>
</StackPanel>
private void got(object sender, RoutedEventArgs e)
{myPopup.IsOpen = true;
}private void lost(object sender, RoutedEventArgs e)
{myPopup.IsOpen = false;
}private void ListBoxSelect(object sender, SelectionChangedEventArgs e)
{Menu.Text = (list.SelectedItem as ListBoxItem).Content.ToString();
}

 4.12 Image图片

Source图片来源
StretchDirection

图片缩放条件。

UpOnly:仅在小于父级时缩放;DownOnly:仅在大于父级时缩放;Both:兼容前两者

Stretch

图片缩放模式。

None:保持原始大小;Fill:调整内容大小以填充目标尺寸;Uniform:保持纵横比基础上缩放;UniformToFill:保持纵横比基础上缩放,还具有裁剪功能;

4.12.1 圆形图片

<StackPanel><Ellipse Width="200" Height="200"><Ellipse.Fill><ImageBrush ImageSource="Images/csharp.png" /></Ellipse.Fill></Ellipse>
</StackPanel>

 4.13 GroupBox分组容器

 4.13.1 基本使用

<Grid Width="400" Margin="0,40"><!--定义行--><Grid.RowDefinitions><RowDefinition /><RowDefinition /></Grid.RowDefinitions><GroupBox Header="基本信息"><!--定义第一行内部--><Grid><Grid.RowDefinitions><RowDefinition /><RowDefinition /></Grid.RowDefinitions><Grid.ColumnDefinitions><ColumnDefinition Width="Auto" /><ColumnDefinition /></Grid.ColumnDefinitions><TextBlock Text="姓名:" VerticalAlignment="Center" Margin="2,0" /><TextBox Grid.Column="1" Width="200" Height="20" HorizontalAlignment="Left" Margin="5,0" /><TextBlock Grid.Row="1" Text="性别:" VerticalAlignment="Center" Margin="2,0" /><WrapPanel Grid.Row="1" Grid.Column="1" Width="200" Height="30" HorizontalAlignment="Left"><RadioButton Content="男" GroupName="sex" Margin="7" /><RadioButton Content="女" GroupName="sex" Margin="7" /></WrapPanel></Grid></GroupBox>
</Grid>

 4.13.2 自定义header属性

<GroupBox.Header><StackPanel Orientation="Horizontal"><Image Source="Images/csharp.png" Width="20" /><TextBlock Text="基本信息" VerticalAlignment="Center" Margin="5,0" /></StackPanel>
</GroupBox.Header>

4.14 ScrollViewer 视图滚动控件

        当在一个固定大小的布局格子中的内容查出格子范围时可以使用ScrollViewer;

<ScrollViewer><!--定义第一行内部--><Grid><Grid.RowDefinitions><RowDefinition Height="200" /><RowDefinition /></Grid.RowDefinitions><Grid.ColumnDefinitions><ColumnDefinition Width="Auto" /><ColumnDefinition /></Grid.ColumnDefinitions><TextBlock Text="姓名:" VerticalAlignment="Center" Margin="2,0" /><TextBox Grid.Column="1" Width="200" Height="20" HorizontalAlignment="Left" Margin="5,0" /><TextBlock Grid.Row="1" Text="性别:" VerticalAlignment="Center" Margin="2,0" /><WrapPanel Grid.Row="1" Grid.Column="1" Width="200" Height="30" HorizontalAlignment="Left"><RadioButton Content="男" GroupName="sex" Margin="7" /><RadioButton Content="女" GroupName="sex" Margin="7" /></WrapPanel></Grid>
</ScrollViewer>

4.15 Slider 滑块

        案例:通过Slider控制图片的透明度

<Grid Width="400" Margin="0,40"><Grid.RowDefinitions><RowDefinition /><RowDefinition Height="Auto" /></Grid.RowDefinitions><Image Source="Images/csharp.png" Width="200" Height="200" Opacity="{Binding ElementName=slider, Path=Value}"/><!--Value:默认透明度 Maximum:最大值--><Slider x:Name="slider" Value="0.3" Grid.Row="1" Maximum="1" />
</Grid>

4.16 ProgressBar进度条

<StackPanel VerticalAlignment="Center"><ProgressBar x:Name="progress" Width="200" Height="10" Maximum="100" /><TextBlock x:Name="txt" VerticalAlignment="Center" HorizontalAlignment="Center">0%</TextBlock>
</StackPanel>

4.17 Calendar日历控件

4.18 DatePicker日期选择控件

相关文章:

基于.NET6的WPF基础总结(上)

目录 一.常用属性介绍 二、 程序退出方式 三、布局样式 3.1 Panel的附加属性ZIndex 3.2 Grid(网格)布局 3.3 UniformGrid&#xff08;均分布局&#xff09; 3.4 StackPanel&#xff08;堆积面板&#xff09; 3.5 WrapPanel&#xff08;换行面板&#xff09; 3.6 Doc…...

Nuxt3入门:资源文件(第2节)

你好同学&#xff0c;我是沐爸&#xff0c;欢迎点赞、收藏、评论和关注。 Nuxt 为资源存放提供两种选择。可以使用两个目录&#xff08;public/assets&#xff09;来处理样式表、字体或图像等资源。 public/ 此目录中的文件将按原样复制到服务器根目录中。assets/ 此目录中的…...

企业微信中嵌套的h5应用调用微信扫码功能

企业微信官方文档 1.登录企业微信后台,管理员可操作,打开应用配置应用可信域名(必须配置,否则无法调用jsapi,可信域名必须有ICP备案且在管理端验证域名归属) 配置部署后的前台域名地址 配置可信域名,部署后的服务器域名(需备案认证) 当域名权限不够时需下载文件效验,将文件放…...

Excel如何把表格变成图表

Excel如何把表格变成图表 ‌将Excel表格转换为图表‌的过程相对简单且直观&#xff0c;主要步骤包括准备数据、插入图表、设置图表格式等。 以下是详细的步骤说明&#xff1a; ‌准备数据‌&#xff1a;首先&#xff0c;在Excel表格中输入或准备好要创建图表的数据。这些数据可…...

HTTP 三、http在springboot中得应用

一、springboot处理http请求的过程 1、客户端发起HTTP请求&#xff0c;经过网络传输到服务器 HTTP请求通常由浏览器、Postman、curl或其他HTTP客户端发起&#xff0c;客户端的HTTP请求通过网络&#xff08;通常是TCP/IP协议&#xff09;传输到服务器&#xff0c;这个请求首先会…...

Java秋招面经(网搜版)

1.redis的数据结构 Redis 提供了多种高效的数据结构来满足不同的应用需求。主要包括字符串&#xff08;String&#xff09;&#xff0c;这是最基础的数据类型&#xff0c;支持存储和操作各种数据&#xff1b;哈希&#xff08;Hash&#xff09;&#xff0c;类似于键值对的集合&…...

【Android】Material Design编写更好的UI

Toolbar 对于控件ActionBar我们非常熟悉&#xff0c;就是我们常见的标题栏&#xff0c;但ActionBar只能位于活动的顶部&#xff0c;因此我们更建议使用Toolbar。在新建一个项目的时候都是默认显示ActionBar&#xff0c;我们要使用Toolbar就需要先将标题栏改为不显示 先来看看…...

剪辑视频,这四大工具助你一臂之力!

在这个数字化的时代&#xff0c;视频已成为一种重要的表达手段。无论您是专业视频制作者还是只是偶尔想要编辑一些个人视频&#xff0c;一款优秀的视频剪辑软件都将是您不可或缺的好帮手。以下是几款值得推荐的视频剪辑软件。 福昕视频剪辑 直达链接&#xff1a;www.pdf365.c…...

基于单片机的热成像测温显示系统设计

本设计基于单片机的热成像测温显示系统&#xff0c;本系统包括STM32F103C6T6微控制器、MLX90640红外温度传感器、TFT-LCD显示屏、AT24C02存储模块、报警模块、按键模块和MP3语音播报模块。其可以通过热成像传感器对被检测物体的温度进行非接触式测量&#xff0c;并能够将被测信…...

CSS系列之Float浮动(二)

一、传统网页布局 网页布局的本质&#xff1a;用 CSS 来摆放盒子&#xff0c;把盒子摆放到相应位置。CSS 提供了三种传统布局方式&#xff08;这里指的只是传统布局&#xff0c;其实还有一些特殊高级的布局方式&#xff09;&#xff1a; 标准流浮动定位 1、所谓的标准流&#…...

macos下的 sed命令安装与使用 gnu-sed

sed命令是我们在linu类系统中非常重要的一个命令, 但是在macos下面默认是没有sed命令的, 不过我们可以通过brew install gnu-sed ( 或者通过 sudo port install gsed )这个软件包来获得这个命令 GNU sed 命令安装 下面2种方式,选择一种安装即可 # brew安装 brew install gn…...

RLC(电阻、电感、电容)

RLC&#xff08;电阻、电感、电容&#xff09; 目录一、两个电阻&#xff08;R1&#xff0c;R2&#xff09;&#xff0c;电容&#xff08;C1&#xff0c;C2&#xff09;的串联/并联公式&#xff1f;二、请画出这个1ms&#xff0c; 1V的Vin脉冲信号在Vout端的大致图像1.电路图2.…...

语音测试(一)ffmpeg视频转音频

视频转音频 下载ffmpeg工具进入bin目录cmd进入控制台输入命令 ffmpeg.exe -i ./视频.mp4 ./音频.wav命令说明 ffmpeg -i input.mp4 output.mkv FFmpeg 可能会尝试自动选择合适的编码器对视频和音频进行重新编码&#xff0c;以便适应 MKV 格式的要求ffmpeg -i input.mp4 -c c…...

计算机网络八股文之TCP协议

TCP/IP模型 链路层 物理层&#xff1a;主要定义物理设备标准&#xff0c;如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流&#xff08;就是由1、0转化为电流强弱来进行传输&#xff0c;到达目的地后再转化为1、0&#xff0c;也就是我们…...

【linux】linux中如何通过stress进行压力测试,原理解析与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…...

python用波形显示udp数据实现一个模拟示波器

显示端代码: import socket import matplotlib.pyplot as plt import matplotlib.animation as animation import numpy as np# UDP setup udp_ip = 0.0.0.0 # Listen on all network interfaces udp_port = 12345 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)…...

开源通用验证码识别OCR —— DdddOcr 源码赏析(二)

文章目录 前言DdddOcr分类识别调用识别功能classification 函数源码classification 函数源码解读1. 分类功能不支持目标检测2. 转换为Image对象3. 根据模型配置调整图片尺寸和色彩模式4. 图像数据转换为浮点数据并归一化5. 图像数据预处理6. 运行模型&#xff0c;返回预测结果 …...

【个人笔记】VCS工具与命令

Title&#xff1a;VCS工具学习 一 介绍 是什么&#xff1f; VCS (Verilog Compiler Simulator) 是synopsys的verilog 仿真软件&#xff0c;竞品有Mentor公司的Modelsim、Cadence公司的NC-Verilog、Verilog—XL. VCS能够 分析、编译 HDL的design code&#xff0c;同时内置了 仿…...

面试进去8分钟就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%,这…...

探索MongoDB的Python之钥:pymongo的魔力

文章目录 探索MongoDB的Python之钥&#xff1a;pymongo的魔力背景&#xff1a;为什么选择pymongo&#xff1f;简介&#xff1a;pymongo是什么&#xff1f;安装&#xff1a;如何将pymongo纳入你的项目&#xff1f;基础用法&#xff1a;五个核心函数介绍1. 连接到MongoDB2. 选择数…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

负载均衡器》》LVS、Nginx、HAproxy 区别

虚拟主机 先4&#xff0c;后7...

Mac flutter环境搭建

一、下载flutter sdk 制作 Android 应用 | Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 1、查看mac电脑处理器选择sdk 2、解压 unzip ~/Downloads/flutter_macos_arm64_3.32.2-stable.zip \ -d ~/development/ 3、添加环境变量 命令行打开配置环境变量文件 ope…...

边缘计算网关提升水产养殖尾水处理的远程运维效率

一、项目背景 随着水产养殖行业的快速发展&#xff0c;养殖尾水的处理成为了一个亟待解决的环保问题。传统的尾水处理方式不仅效率低下&#xff0c;而且难以实现精准监控和管理。为了提升尾水处理的效果和效率&#xff0c;同时降低人力成本&#xff0c;某大型水产养殖企业决定…...

未授权访问事件频发,我们应当如何应对?

在当下&#xff0c;数据已成为企业和组织的核心资产&#xff0c;是推动业务发展、决策制定以及创新的关键驱动力。然而&#xff0c;未授权访问这一隐匿的安全威胁&#xff0c;正如同高悬的达摩克利斯之剑&#xff0c;时刻威胁着数据的安全&#xff0c;一旦触发&#xff0c;便可…...

深入浅出JavaScript中的ArrayBuffer:二进制数据的“瑞士军刀”

深入浅出JavaScript中的ArrayBuffer&#xff1a;二进制数据的“瑞士军刀” 在JavaScript中&#xff0c;我们经常需要处理文本、数组、对象等数据类型。但当我们需要处理文件上传、图像处理、网络通信等场景时&#xff0c;单纯依赖字符串或数组就显得力不从心了。这时&#xff…...