WPF---1.入门学习

学习来源

布局

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");
            }
        }
    }
}

大练习

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

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

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

相关文章

java项目加载lib下的jar包

一、选择项目结构 二、点击模块-->依赖-->加号 三、选择lib下的jar包 四、加载成功 完成 ps&#xff1a;部署直接部署&#xff08;jar包加载就行&#xff09;

SpringBoot集成Solr全文检索

SrpingBoot 集成 Solr 实现全文检索 一、核心路线 使用 Docker 镜像部署 Solr 8.11.3 版本服务使用 ik 分词器用于处理中文分词使用 spring-boot-starter-data-solr 实现增删改查配置用户名密码认证使用 poi 和 pdfbox 组件进行文本内容读取文章最上方有源码和 ik 分词器资源…

Matlab|基于模型预测控制(MPC)的微电网调度优化的研究

目录 1 主要内容 2 程序难点及问题说明 3 部分程序 4 下载链接 1 主要内容 该程序分为两部分&#xff0c;日前优化部分——该程序首先根据《电力系统云储能研究框架与基础模型》上面方法&#xff0c;根据每个居民的实际需要得到响应储能充放电功率&#xff0c;优化得到整…

前端学习之css基本网格布局

网格布局 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>网格布局</title><style>.a{/* grid网格布局 */display: grid;width: 400px;height: 400px;border: 1px solid red;/* 设置当前…

华为数通方向HCIP-DataCom H12-821题库(多选题:181-200)

第181题 在BGP中Community属性为可选过渡属性,是一种路由标记,用于简化路由策略的执行。它分为自定义团体属性和公共团体属性,那么以下属于公共团体属性的是哪些项? A、No_Export_Subconfed B、No_Advertise C、No_Export D、Internet 【正确答案】ABCD 【答案解析】 第18…

OpenCV 形态学处理函数

四、形态学处理&#xff08;膨胀&#xff0c;腐蚀&#xff0c;开闭运算&#xff09;_getstructuringelement()函数作用-CSDN博客 数字图像处理(c opencv)&#xff1a;形态学图像处理-morphologyEx函数实现腐蚀膨胀、开闭运算、击中-击不中变换、形态学梯度、顶帽黑帽变换 - 知乎…

LeetCode Python - 74. 搜索二维矩阵

目录 题目描述解法方法一&#xff1a;二分查找方法二&#xff1a;从左下角或右上角搜索 运行结果方法一方法二 题目描述 给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给…

电脑如何更新AMD独立显卡驱动?安装官方驱动的方法来了!

前言 有小伙伴在电脑上安装了独立显卡之后&#xff0c;总会用驱动人生或者驱动精灵等软件给独立显卡安装驱动。这种安装方法并不能说是错的&#xff0c;反正能用就行。 安装官方驱动的办法其实很简单&#xff0c;现在独立显卡一共就那么几家&#xff0c;最常见的显卡就是Nvidi…

技术周刊 117 期:Visual Copilot、INP、Kimi 支持 200 万字上下文、Grok 开源、Figure 01、Open Sora 开源

美味值&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f; 口味&#xff1a;金骏眉 大家好&#xff0c;我是童欧巴。老规矩&#xff0c;咱们先来看技术资讯。 技术资讯 前端 VitePress (早就应该) 1.0 发布MistCSS&#xff0c;只使用 CSS 来…

2024-03-25 作业

作业要求&#xff1a; 整理思维导图定义自己的命名空间&#xff0c;其中有string类型的变量&#xff0c;再定义两个函数&#xff0c;一个函数完成字符串的输入&#xff0c;一个函数完成求字符串长度&#xff0c;再定义一个全局函数完成对该字符串的反转有以下定义&#xff0c;说…

Vue复习

1. MVVM 模型 ● Model&#xff08;模型&#xff09;&#xff1a;表示应用程序中的数据模型。它代表着应用程序中的业务逻辑和状态。 ● View&#xff08;视图&#xff09;&#xff1a;表示应用程序的用户界面。它是用户与应用程序交互的方式。 ● ViewModel&#xff08;视图模…

家政服务管理平台设计与实现|SpringBoot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java&#xff0c;…

Kotlin协程CoroutineScope命名空间CoroutineName,Kotlin

Kotlin协程CoroutineScope命名空间CoroutineName&#xff0c;Kotlin import kotlinx.coroutines.*fun main(args: Array<String>) {val myName CoroutineName("fly")runBlocking {CoroutineScope(Dispatchers.IO).launch {repeat(3) {val name coroutineCont…

后端常问面经之并发

volatile 关键字 volatile关键字是如何保证内存可见性的&#xff1f;底层是怎么实现的&#xff1f; "观察加入volatile关键字和没有加入volatile关键字时所生成的汇编代码发现&#xff0c;加入volatile关键字时&#xff0c;会多出一个lock前缀指令”lock前缀指令实际上相…

15、Spring Cloud Alibaba Sentinel实现熔断与限流

注&#xff1a;本篇文章主要参考周阳老师讲解的cloud进行整理的&#xff01; 1、Sentinel 1.1、官网 https://sentinelguard.io/zh-cn/ 等价对标 Spring Cloud Circuit Breaker 1.2、是什么 https://github.com/alibaba/Sentinel/wiki 1.3、去哪下 https://github.com/alibab…

清华大学突破性研究:GVGEN技术,7秒内从文字到3D高保真生成

引言&#xff1a;3D模型生成的挑战与机遇 随着计算机图形学的发展&#xff0c;3D模型的生成在各个行业中变得越来越重要&#xff0c;包括视频游戏设计、电影制作以及AR/VR技术等。在3D建模的不同方面中&#xff0c;从文本描述生成3D模型成为一个特别有趣的研究领域&#xff0c;…

栈应用之---括号匹配

题意描述&#xff1a; 在算术表达式中&#xff0c;除了加、减、乘、除等运算外&#xff0c;往往还有括号。包括有大括号{}&#xff0c;中括号[]&#xff0c;小括号()&#xff0c;尖括号<>等。 对于每一对括号&#xff0c;必须先左边括号&#xff0c;然后右边括号&#xf…

虚拟线圈法的车辆统计_3.12

目标 车流量统计的方法实现车流量检测 基于虚拟线圈法的车辆统计是一种利用计算机视觉技术模拟传统物理线圈检测原理&#xff0c;对交通视频流中的车辆进行计数的方法。在传统交通监控系统中&#xff0c;物理线圈是通过感应车辆经过时产生的电磁场变化来记录车辆流量。这种方式…

SQL格式化软件 Sql Pretty Printer4.0.1安装

功能 安装成功后&#xff0c;打开SSMS会发现新出一个SQL Beautifier框&#xff0c;点击Format All SQL&#xff08;或者按CtrlJK&#xff09;可以一键格式化代码 效果如下所示 安装 Sql Pretty Printer4.0.1安装程序以及破解dll可以在我的github中获取 https://github.com/su…

程序员实用学习平台,必看榜!

只要卷不死&#xff0c;就往死里卷&#xff01; 高中老师宣扬的励志鸡汤&#xff0c;仿佛走出了校园踏入社会仍然适用。 “出走半生&#xff0c;归来仍是少年。”emm....... 如今比麻花还卷的社会&#xff0c;学到老才能活到老啊~尤其咱们IT这么优胜劣汰的行业&#xff0c;自是…