WPF---1.入门学习

news2024/9/23 13:19:20

学习来源

布局

wpf布局原则

一个窗口中只能包含一个元素
不应显示设置元素尺寸
不应使用坐标设置元素的位置
可以嵌套布局容器
StackPanel-->表单条件查找布局
DataGrid

wpf布局容器

StackPanel: 水平或垂直排列元素,Orientation属性分别: Horizontal / Vertical
WrapPanel : 水平或垂直排列元素、针对剩余空间不足会进行换行或换列进行排列
DockPanel : 根据容器的边界、元素进行Dock.Top、Left、Right、Bottom设置
Grid : 类似table表格、可灵活设置行列并放置控件元素、比较常用
Canvas : 使用固定的坐标设置元素的位置、不具备锚定停靠等功能。

Grid

 <Grid>
        <Grid.RowDefinitions>
            <!--自适应,根据内容的高度设置-->
            <!--<RowDefinition Height="AUTO"/>-->
            <!--绝对定位-->
            <!--<RowDefinition Height="200"/>-->
            <!--比例-->
            <RowDefinition Height="2*"/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <!--<Button Background="Yellow" Height="150"></Button>
        <Button Background="Red" Height="50"></Button>-->

        <Button Grid.Column="1"></Button>
        <Button Grid.Column="1" Grid.Row="1" Background="Black"></Button>
        <Button Grid.Row="1" Background="Blue"></Button>
        
        <!--跨行列-->
        <!--<Button Grid.Row="1" Grid.ColumnSpan="2" Background="Red"></Button>-->
    </Grid>

布局容器

<Grid>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <StackPanel>
            <Button Width="100" Height="50">Button</Button>
            <Button Width="100" Height="50">Button</Button>
            <Button Width="100" Height="50">Button</Button>
            <Button Width="100" Height="50">Button</Button>
            <Button Width="100" Height="50">Button</Button>
            <Button Width="100" Height="50">Button</Button>
            <Button Width="100" Height="50">Button</Button>
        </StackPanel>
        <WrapPanel Grid.Row="1"  Orientation="Vertical">
            <Button Width="100" Height="50">Button</Button>
            <Button Width="100" Height="50">Button</Button>
            <Button Width="100" Height="50">Button</Button>
            <Button Width="100" Height="50">Button</Button>
            <Button Width="100" Height="50">Button</Button>
            <Button Width="100" Height="50">Button</Button>
            <Button Width="100" Height="50">Button</Button>
        </WrapPanel>
        <DockPanel Grid.Column="1"  LastChildFill="False"> 
            <Button Width="80" Height="50" DockPanel.Dock="Bottom">Button1</Button>
            <Button Width="80" Height="50" DockPanel.Dock="Left">Button1</Button>
            <Button Width="80" Height="50" DockPanel.Dock="Right">Button1</Button>
            <Button Width="80" Height="50" DockPanel.Dock="Top">Button1</Button>
        </DockPanel>
        <UniformGrid Grid.Row="1" Grid.Column="1" Rows="3" Columns="3">
            <Button>Button</Button>
            <Button>Button</Button>
            <Button>Button</Button>
            <Button>Button</Button>
            <Button>Button</Button>
            <Button>Button</Button>
            <Button>Button</Button>
            <Button>Button</Button>
        </UniformGrid>
    </Grid>

Canvas

<Canvas Margin="10,10,10,10" Background="White" >
        <Rectangle Name="rect" Canvas.Left="100" Canvas.Top="180" Fill="Black" Stroke="Red"  Width="200" Height="200"/>
        <Ellipse  Name="el" Canvas.Left="500" Canvas.Top="150" Fill="Azure" Stroke="Green" Width="180" Height="180"/>
</Canvas>

样式

WPF中的各类控件元素, 都可以自由的设置其样式。 诸如:
字体(FontFamily)
字体大小(FontSize)
背景颜色(Background)
字体颜色(Foreground)
边距(Margin)
水平位置(HorizontalAlignment)
垂直位置(VerticalAlignment) 等等。

<Window.Resources>
        <Style x:Key="TextBlockStyle"  TargetType="{x:Type TextBlock}">
            <Setter Property="FontFamily" Value="宋体"/>
            <Setter Property="FontSize" Value="30"/>
            <Setter Property="Foreground" Value="Red"/>
            <Setter Property="FontWeight" Value="Bold"/>
        </Style>
    </Window.Resources>
    <StackPanel  HorizontalAlignment="Center" VerticalAlignment="Center">
        <TextBlock Text="字体一" Style="{StaticResource TextBlockStyle}"/>
        <TextBlock Text="字体一" Style="{StaticResource TextBlockStyle}"/>
        <TextBlock Text="字体一" Style="{StaticResource TextBlockStyle}"/>
    </StackPanel>

触发器

顾名思义, 触发器可以理解为, 当达到了触发的条件, 那么就执行预期内的响应, 可以是样式、数据变化、动画等。

触发器通过 Style.Triggers集合连接到样式中, 每个样式都可以有任意多个触发器, 并且每个触发器都是 System.Windows.TriggerBase的派生类实例, 以下是触发器的类型

Trigger : 监测依赖属性的变化、触发器生效
MultiTrigger : 通过多个条件的设置、达到满足条件、触发器生效
DataTrigger : 通过数据的变化、触发器生效
MultiDataTrigger : 多个数据条件的触发器
EventTrigger : 事件触发器, 触发了某类事件时, 触发器生效。

Trigger

<Window.Resources>
        <Style x:Key="TextBlockStyle"  TargetType="{x:Type TextBlock}">
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="true">
                    <Setter Property="Foreground" Value="Blue"/>
                </Trigger>
            </Style.Triggers>
            <Setter Property="FontFamily" Value="宋体"/>
            <Setter Property="FontSize" Value="30"/>
            <Setter Property="Foreground" Value="Red"/>
            <Setter Property="FontWeight" Value="Bold"/>
        </Style>
    </Window.Resources>
    <StackPanel  HorizontalAlignment="Center" VerticalAlignment="Center">
        <TextBlock Text="字体一" Style="{StaticResource TextBlockStyle}"/>
        <TextBlock Text="字体一" Style="{StaticResource TextBlockStyle}"/>
        <TextBlock Text="字体一" Style="{StaticResource TextBlockStyle}"/>
    </StackPanel>

MultiTrigger

<Window.Resources>
        <Style x:Key="TextBlockStyle"  TargetType="{x:Type Button}">
            <Style.Triggers>
                <MultiTrigger>
                    <MultiTrigger.Conditions>
                        <Condition Property="IsMouseOver" Value="true"/>
                        <Condition Property="IsPressed" Value="true"/>
                    </MultiTrigger.Conditions>
                    <MultiTrigger.Setters>
                        <Setter Property="Foreground" Value="Black"/>
                    </MultiTrigger.Setters>
                </MultiTrigger>
            </Style.Triggers>
            <Setter Property="FontFamily" Value="宋体"/>
            <Setter Property="FontSize" Value="30"/>
            <Setter Property="Foreground" Value="Red"/>
            <Setter Property="FontWeight" Value="Bold"/>
        </Style>
    </Window.Resources>
    <StackPanel  HorizontalAlignment="Center" VerticalAlignment="Center">
        <Button Content="按钮一" Style="{StaticResource TextBlockStyle}"/>
        <Button Content="按钮一" Style="{StaticResource TextBlockStyle}"/>
        <Button Content="按钮一" Style="{StaticResource TextBlockStyle}"/>
    </StackPanel>

控件模板

在这里插入图片描述
在这里插入图片描述
回到当前的xaml文件中
在这里插入图片描述

数据模板

https://www.cnblogs.com/wzh2010/p/6425060.html
元素绑定 资源绑定 DataContext绑定 属性绑定、按钮绑定

元素绑定

OneWay(单向绑定) : 当源属性发生变化更新目标属性, 类似上面的例子中, 滑动变化更新文本的数据 TwoWay(双向绑定) : 当源属性发生变化更新目标属性, 目标属性发生变化也更新源属性。 OneTime(单次模式) : 根据第一次源属性设置目标属性, 在此之后所有改变都无效。 OneWayToSource : 和OneWay类型, 只不过整个过程倒置。 Default : 既可以是双向,也可以是单项, 除非明确表明某种模式, 否则采用该默认绑定
单向绑定

<StackPanel  HorizontalAlignment="Center" VerticalAlignment="Center">
        <Slider x:Name="slider" Width="200"/>
        <TextBox Text="{Binding ElementName=slider,Path=Value,UpdateSourceTrigger=PropertyChanged}" ></TextBox>
    </StackPanel>

单次模式

<StackPanel  HorizontalAlignment="Center" VerticalAlignment="Center">
        <Slider x:Name="slider" Width="200" Value="2"/>
        <TextBox Text="{Binding ElementName=slider,Path=Value,Mode=OneTime,UpdateSourceTrigger=PropertyChanged}" ></TextBox>
    </StackPanel>

绑定到非元素

Source绑定

<Window.Resources>
        <TextBox x:Key="txt">Hello World</TextBox>
    </Window.Resources>
    <StackPanel  HorizontalAlignment="Center" VerticalAlignment="Center">
        <TextBox Text="{Binding Source={StaticResource txt},Path=Text}" ></TextBox>
    </StackPanel>

DataSource绑定

 public MainWindow()
       {
           InitializeComponent();
           nameTextBox.DataContext = new Person() { name="xlwang"};
       }


       public class Person {
           public String name { get; set; }
       }
       
       
   <Window.Resources>
       <TextBox x:Key="txt">Hello World</TextBox>
   </Window.Resources>
   <StackPanel  HorizontalAlignment="Center" VerticalAlignment="Center">
       <TextBox x:Name="nameTextBox" Text="{Binding name,FallbackValue='Not Found'}" Width="200" ></TextBox>
   </StackPanel>

数据绑定

mvvm

实现思路:实现通知接口 实现Icommand接口 创建界面对应的viewmodel 界面后台初始化数据 界面绑定数据

实现通知接口

class NotificationObject : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;


        public void RaisePropertyChanged(string propetyName) {
            if (this.PropertyChanged != null) {
                this.PropertyChanged.Invoke(this,new PropertyChangedEventArgs(propetyName));
            }
        }
    }

实现ICommand接口

class DelegateCommand : ICommand
    {
        public event EventHandler CanExecuteChanged;


        public bool CanExecute(object parameter)
        {
            if (CanExecuteFun == null)
            {
                return true;
            }
            return this.CanExecuteFun(parameter);
        }


        public void Execute(object parameter)
        {
            if (ExecuteAction == null)
            {
                return;
            }
            this.ExecuteAction(parameter);
        }


        public Action<object> ExecuteAction { get; set; }
        public Func<object,bool> CanExecuteFun { get; set; }
    }

创建界面对应的viewmodel

class Window2ViewModel:NotificationObject
    {
        public Window2ViewModel()
        {
            this.addCommand = new DelegateCommand();
            this.addCommand.ExecuteAction = new Action<object>(this.add);
        }


        private double _val1;


        public double val1
        {
            get { return _val1; }
            set { _val1 = value;
                this.RaisePropertyChanged("val1");
            }
        }


        private double _val2;
        public double val2
        {
            get { return _val2; }
            set
            {
                _val2 = value;
                this.RaisePropertyChanged("val2");
            }
        }


        private double _result;
        public double result
        {
            get { return _result; }
            set
            {
                _result = value;
                this.RaisePropertyChanged("result");
            }
        }


        public DelegateCommand addCommand { get; set; }


        private void add(object param) {
            this.result = this.val1 + this.val2;
        }
    }

界面数据绑定

public Window2()
        {
            InitializeComponent();
            this.DataContext = new Window2ViewModel();
        }

界面

<StackPanel>
        <!--<TextBox x:Name="txt1" Text="{Binding val1}"></TextBox>
        <TextBox x:Name="txt2" Text="{Binding val2}"></TextBox>
        <TextBox x:Name="result" Text="{Binding result}"></TextBox>-->
        <Slider x:Name="s1"  Value="{Binding val1}"></Slider>
        <Slider x:Name="s2"  Value="{Binding val2}"></Slider>
        <Slider x:Name="result" Value="{Binding result}"></Slider>
        <Button Content="提交" Command="{Binding addCommand}"></Button>
    </StackPanel>

mvvvm练习

window.xaml

<Window x:Class="wpf_study.Window1"
        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:wpf_study"
        mc:Ignorable="d"
        Title="Window1" Height="450" Width="800" >
    <Window.Resources>
     
    </Window.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="60"></RowDefinition>
            <RowDefinition></RowDefinition>
        </Grid.RowDefinitions>
        <StackPanel>
            <Button Content="添加" Command="{Binding addCommand}" ></Button>
        </StackPanel>
        <DataGrid Grid.Row="1" x:Name="dg" AutoGenerateColumns="False" ColumnWidth="*" ItemsSource="{Binding stuList}">
            <DataGrid.Columns>
                <DataGridTextColumn Header="序号" Binding="{Binding id}"></DataGridTextColumn>
                <DataGridTextColumn Header="姓名" Binding="{Binding UserName}"></DataGridTextColumn>
                <DataGridTemplateColumn Header="操作">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal">
                                <Button Content="修改" ></Button>
                                <Button Content="删除" CommandParameter="{Binding id}"
                                        Command="{Binding DataContext.delCommand,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=DataGrid}}"></Button>
                            </StackPanel>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

window.xaml.cs

using GalaSoft.MvvmLight.Command;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using wpf_study.viewmodel;


namespace wpf_study
{
    /// <summary>
    /// Window1.xaml 的交互逻辑
    /// </summary>
    public partial class Window1 : Window
    {
      


        public Window1()
        {
            InitializeComponent();
            this.DataContext = new Window1ModelView();
           
        }
    }
}

windowModelView.cs

using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Command;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;


namespace wpf_study.viewmodel
{
    class Window1ModelView:ViewModelBase
    {
        #region 暴露命令
        private RelayCommand _addCommand;


        public RelayCommand addCommand
        {
            get
            {
                if (_addCommand == null)
                {
                    _addCommand = new RelayCommand(() => {
                        int rand = new Random().Next(0, 1000);
                        stuList.Add(new Student() { UserName = String.Format("random{0}", rand), id = rand });
                    });
                }
                return _addCommand;
            }
        }


        private RelayCommand<int> _delCommand;


        public RelayCommand<int> delCommand
        {
            get
            {
                if (_delCommand == null)
                {
                    _delCommand = new RelayCommand<int>((o) => {
                        MessageBox.Show("删除" + o);
                    });
                }
                return _delCommand;
            }
        }
        #endregion


        #region 暴露数据
        private ObservableCollection<Student> _stuList;


        public ObservableCollection<Student> stuList
        {
            get { return _stuList; }
            set
            {
                _stuList = value;
                RaisePropertyChanged("stuList");
            }
        }
        #endregion


        public Window1ModelView() {
            stuList = new ObservableCollection<Student>();
            stuList.Add(new Student() { UserName = "小王", id = 1 });
            stuList.Add(new Student() { UserName = "小李", id = 2 });
            stuList.Add(new Student() { UserName = "小张", id = 3 });
            stuList.Add(new Student() { UserName = "小黑", id = 4 });
        }
    }
    public class Student:ViewModelBase
    {
        private string userName;


        public string UserName
        {
            get { return userName; }
            set { userName = value;
                RaisePropertyChanged("UserName");
            }
        }

        private int _id;

        public int id
        {
            get { return _id; }
            set {
                _id = value;
                RaisePropertyChanged("id");
            }
        }
    }
}

大练习

使用布局容器,排版出下面布局
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

查询正在运行的Top SQL的脚本(建议收藏)

这篇文章提供了一些现成的SQL脚本&#xff0c;通过查询V$SQLSTATS视图找到正在运行的TOP SQL&#xff0c;用于后续的优化。建议大家收藏&#xff0c;需要查询TOP SQL时直接复制和粘贴即可。 之前的一篇文章解释了为什么要使用V$SQLSTATS视图。 当数据库表现出各种不同的性能问…

Linux/WifineticTwo

WifineticTwo Enumeration nmap 经过使用 nmap 对常见的 1000 个端口进行扫描&#xff0c;并加入禁止 ping 的参数&#xff0c;长时间的扫描结果显示&#xff0c;仅有 22 和 8080 两个端口处于开放状态 ┌──(kali㉿kali)-[~/vegetable/HTB/WifineticTwo] └─$ nmap 10.10…

渗压计测量:VW-102A与WM-103型读数仪的应用与优势

在当代工程测量领域&#xff0c;准确监测地下水压力变化对于确保建筑结构的安全和稳定至关重要。渗压计作为一种专业的测量工具&#xff0c;能够精确地监测和记录地下水的压力变化&#xff0c;是水利工程、地下建筑、坝体安全监测等领域不可或缺的仪器。今天主要给大家介绍下读…

make menuconfig

本文不是分析Linux的make menuconfig&#xff0c;而是如何将Linux这套机制适配到自己的项目里。 Linux内核配置工具会使用到menuconfig。menuconfig会用到mconf、conf两个命令。这两个命令是编译内核自动生成的。网上有开源的实现&#xff0c;我们下载下来自己编译&#xff1a…

SQLiteC/C++接口详细介绍sqlite3_stmt类(七)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍sqlite3_stmt类&#xff08;六&#xff09; 下一篇&#xff1a; 无 22、sqlite3_column_database_name 用于返回结果集中指定列的数据库名称。如果结果集是由多个Join操作产生的&#xff0c;…

公域流量和私域流量该如何选择?

很多客户在做品牌推广的时候&#xff0c;都会犹豫应该把精力投放到公域流量还是做自己的私域流量。特别是现在流量为王的时代&#xff0c;大部分客户都在布局做公域流量&#xff0c;砸钱推广&#xff0c;直播带货各种形式进行曝光。 在无论是线上还是线下的公共领域&#xff0…

Microsoft Remote Desktop:无缝连接,高效远程工作的首选工具

随着科技的发展&#xff0c;远程工作已经成为了越来越多人的选择。在这样的背景下&#xff0c;一款高效、稳定且安全的远程桌面工具显得尤为重要。Microsoft Remote Desktop正是这样一款能够满足用户需求的远程桌面软件。 Microsoft Remote Desktop是微软开发的一款专为远程连…

38张最全计算机网络基础思维导图,值得一看!

你们好&#xff0c;我的网工朋友。 计算机网络基础知识点多且杂&#xff0c;想要系统地学习&#xff0c;思维导图肯定是必不可少的。 今天我给你找全了38张思维导图&#xff0c;帮助你轻松理清思路&#xff0c;快速掌握关键内容。 建议你收藏起来慢慢看&#xff0c;在看过之…

宋仕强说金航标kinghelm萨科微slkor都是网红品牌

宋仕强说金航标kinghelm萨科微slkor都是网红品牌&#xff0c;和宋仕强先生研究的“华强北”大ip一起&#xff0c;相互支持相互驱动&#xff0c;与金航标网站&#xff08;www.kinghelm.com.cn&#xff09;、萨科微网站&#xff08;www.slkormicro.com&#xff09;组合成为宣传矩…

2024/3/24--爬虫库

1.常用的爬虫库 (1)在setting的project里面点击Python Interpreter (2&#xff09;常用的爬虫库有 import requests //用途&#xff1a;用于发送HTTP请求。from bs4 import BeautifulSoup //用于从HTML或XML文档中提取数据。import scrapy //一个功能强大的爬虫框架&#xf…

基于Java的流浪动物收容与领养网站

基于Java的流浪动物收容与领养网站的设计与实现 摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和遍及使得各种信息系统的开发成为一定。 流浪动物收容与领养管理系统&#xff0c;主要的模块包括首页、个人中心、用户管理、员工…

.NET分布式Orleans - 2 - Grain的通信原理与定义

Grain 是 Orleans 框架中的基本单元&#xff0c;代表了应用程序中的一个实体或者一个计算单元。 每个Silo都是一个独立的进程&#xff0c;Silo负责加载、管理和执行Grain实例&#xff0c;并处理来自客户端的请求以及与其他Silo之间的通信。 通信原理 在相同的Silo中&#xff0…

Vue动态设置控制表格列表展现列

最近遇到一个需求,表格列表默认不展示某一列,当我设置后可以展示该列,也可以展示和隐藏别的列,起到可以对整个表格列展示隐藏控制的效果,如下示例,默认不展示“单位名称”这一列,在我点击设置齿轮后可以看到,有“单位名称”这一列,但未打钩: 当我勾中“单位名称”,…

【解决】Unity Profiler | Sempaphore.WaitForSignal

开发平台&#xff1a;Unity 2022 版本以上 开发语言&#xff1a;CSharp 6.0 编程平台&#xff1a;Visual Studio 2022 关键词&#xff1a;Sempaphore.WaitForSignal   问题背景 开发过程中出现 Waiting to excute code… 长时间阻碍运行。使用 逐对象排查法 确认影响无法运行…

mineadmin前端安装启动

在上一篇文章中&#xff0c; 我们已经搭建好了后端环境并启动 mineadmin 快速安装部署&#xff08;docker环境&#xff09; 一、下载前端项目 1、在搭建后端时候&#xff0c;使用php bin/hyperf.php mine:install 的时候&#xff0c;有一个步骤是安装前端项目的。安装目录为&a…

Altair Compose® 数学运算、编程、数据分析及可视化

Altair Compose 数学运算、编程、数据分析及可视化 分析数据、开发算法或创建模型 - Altair Compose 旨在将你的想法付诸实施。 Altair Compose 是一个用于数学计算、数据操作和可视化、编程和调试脚本的环境&#xff0c;对重复运算和流程自动化非常有用。Altair Compose 让用…

Chrome 插件打包发布

插件打包发布 一、打包成 zip 包 最简单方便的一种其实就是打包成 zip 包&#xff0c;通过下载链接进行下载&#xff0c;在包里面通过设置版本号和数据库的版本号对比来提醒用户进行新包的下载。 二、发布到 Chrome 应用商店 1. 注册成为开发者 在发布到 chrome 应用商店之…

C++第十一弹---类与对象(八)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1、友元 1.1、友元函数 1.2、友元类 2、内部类 3、匿名对象 4、拷贝对象时的一些编译器优化 总结 1、友元 友元提供了一种突破封装的方式&a…

伦敦金与纸黄金有什么区别?怎么选?

伦敦金与纸黄金都是与黄金相关的投资品种&#xff0c;近期黄金市场的上涨吸引了投资者的关注&#xff0c;那投资者想开户入场成为黄金投资者应该选择纸黄金还是伦敦金呢&#xff1f;两者有何区别呢&#xff1f;下面我们就来讨论一下。 伦敦金是一种起源于伦敦的标准化黄金交易合…

ssm+vue的消防物资存储系统(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频&#xff1a; ssmvue的消防物资存储系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;ssm vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…