From 13dfcef845738dce8b20b81cabd853a2e8757536 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BD=97=E6=99=93=E8=BD=A9?= <1656626645@qq.com> Date: Sat, 22 Oct 2022 07:24:46 +0000 Subject: [PATCH 1/6] =?UTF-8?q?2020302111136-=E7=BD=97=E6=99=93=E8=BD=A9-?= =?UTF-8?q?=E7=AC=AC=E4=B8=83=E5=91=A8=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 罗晓轩 <1656626645@qq.com> --- ...03\345\221\250\344\275\234\344\270\232.md" | 706 ++++++++++++++++++ MVVM.jpg | Bin 0 -> 31812 bytes MVVM1.jpg | Bin 0 -> 9012 bytes anaconda1.jpg | Bin 0 -> 123308 bytes anaconda2.jpg | Bin 0 -> 3959 bytes anaconda3.jpg | Bin 0 -> 113825 bytes anaconda4.jpg | Bin 0 -> 133845 bytes gym1-166633608826919.jpg | Bin 0 -> 33347 bytes gym1.jpg | Bin 0 -> 39207 bytes gym2.jpg | Bin 0 -> 11626 bytes gym3.jpg | Bin 0 -> 119744 bytes gym4-166633650021824.jpg | Bin 0 -> 90136 bytes gym4-166633651118926.jpg | Bin 0 -> 90136 bytes gym4.jpg | Bin 0 -> 72908 bytes gym5.jpg | Bin 0 -> 140164 bytes pytorch1.jpg | Bin 0 -> 42746 bytes pytorch2.jpg | Bin 0 -> 158554 bytes pytorch3.jpg | Bin 0 -> 68663 bytes pytorch4.jpg | Bin 0 -> 149765 bytes pytorch5.jpg | Bin 0 -> 85824 bytes 20 files changed, 706 insertions(+) create mode 100644 "2020302111136-\347\275\227\346\231\223\350\275\251-\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232.md" create mode 100644 MVVM.jpg create mode 100644 MVVM1.jpg create mode 100644 anaconda1.jpg create mode 100644 anaconda2.jpg create mode 100644 anaconda3.jpg create mode 100644 anaconda4.jpg create mode 100644 gym1-166633608826919.jpg create mode 100644 gym1.jpg create mode 100644 gym2.jpg create mode 100644 gym3.jpg create mode 100644 gym4-166633650021824.jpg create mode 100644 gym4-166633651118926.jpg create mode 100644 gym4.jpg create mode 100644 gym5.jpg create mode 100644 pytorch1.jpg create mode 100644 pytorch2.jpg create mode 100644 pytorch3.jpg create mode 100644 pytorch4.jpg create mode 100644 pytorch5.jpg diff --git "a/2020302111136-\347\275\227\346\231\223\350\275\251-\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232.md" "b/2020302111136-\347\275\227\346\231\223\350\275\251-\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232.md" new file mode 100644 index 0000000..33671c5 --- /dev/null +++ "b/2020302111136-\347\275\227\346\231\223\350\275\251-\347\254\254\344\270\203\345\221\250\344\275\234\344\270\232.md" @@ -0,0 +1,706 @@ +# 2020302111136-罗晓轩-第七周作业 + +# 目录 + +[TOC] + +# 一、熟悉MVVM的基本思想 + +## 1、MVVM简介 + +MVVM是Model-View-ViewModel的简写。它本质上就是MVC 的改进版。MVVM 就是将其中的View 的状态和行为抽象化,让我们将视图 UI 和业务逻辑分开。当然这些事 ViewModel 已经帮我们做了,它可以取出 Model 的数据同时帮忙处理 View 中由于需要展示内容而涉及的业务逻辑。微软的WPF带来了新的技术体验,如Silverlight、音频、视频、3D、动画……,这导致了软件UI层更加细节化、可定制化。同时,在技术层面,WPF也带来了 诸如Binding、Dependency Property、Routed Events、Command、DataTemplate、ControlTemplate等新特性。MVVM(Model-View-ViewModel)框架的由来便是MVP(Model-View-Presenter)模式与WPF结合的应用方式时发展演变过来的一种新型架构框架。它立足于原有MVP框架并且把WPF的新特性糅合进去,以应对客户日益复杂的需求变化。 + +![](MVVM.jpg) + +​ 上图描述了MVVM一个基本结构 + + 在MVVM架构中,是不允许数据和视图直接通信的,只能通过ViewModel来通信,而ViewModel就是定义了一个Observer观察者。ViewModel是连接View和Model的中间件。 + + MVVM源自于经典的MVC(Model-View-Controller)模式。MVVM的核心是ViewModel层,负责转换Model中的数据对象来让数据变得更容易管理和使用,其作用如下: + + 该层向上与视图层进行双向数据绑定。 + + 向下与Model层通过接口请求进行数据交互。 + + MVVM已经相当成熟了,主要运用但不仅仅在网络应用程序开发中。当下流向的MVVM框架有Vue.js、AugularJS等。 + +## 2、MVVM优点 + +MVVM模式和MVC模式一样,主要目的是分离视图(View)和模型(Model),有几大优点 + +**1. 低耦合**。视图(View)可以独立于Model变化和修改,一个ViewModel可以绑定到不同的"View"上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。 + +**2. 可重用性**。你可以把一些视图逻辑放在一个ViewModel里面,让很多view重用这段视图逻辑。 + +**3. 独立开发**。开发人员可以专注于业务逻辑和数据的开发(ViewModel),设计人员可以专注于页面设计,使用Expression Blend可以很容易设计界面并生成xaml代码。 + +**4. 可测试**。界面素来是比较难于测试的,测试可以针对ViewModel来写。 + +## 3、MVVM模式的组成部分 + +**模型:** +模型是指代表真实状态内容的领域模型(面向对象),或指代表内容的数据访问层(以数据为中心)。**视图:** +就像在MVC和MVP模式中一样,视图是用户在屏幕上看到的结构、布局和外观(UI)。 +**视图模型** +视图模型是暴露公共属性和命令的视图的抽象。MVVM没有MVC模式的控制器,也没有MVP模式的presenter,有的是一个绑定器。在视图模型中,绑定器在视图和数据绑定器之间进行通信。 +**绑定器** +声明性数据和命令绑定隐含在MVVM模式中。在Microsoft解决方案堆中,绑定器是一种名为XAML的标记语言。绑定器使开发人员免于被迫编写样板式逻辑来同步视图模型和视图。在微软的堆之外实现时,声明性数据绑定技术的出现是实现该模式的一个关键因素。 + +## 4、理论基础 + +MVVM旨在利用WPF中的数据绑定函数,通过从视图层中几乎删除所有GUI代码(代码隐藏),更好地促进视图层开发与模式其余部分的分离。不需要用户体验(UX)开发人员编写GUI代码,他们可以使用框架标记语言(如XAML),并创建到应用程序开发人员编写和维护的视图模型的数据绑定。角色的分离使得交互设计师可以专注于用户体验需求,而不是对业务逻辑进行编程。这样,应用程序的层次可以在多个工作流中进行开发以提高生产力。即使一个开发人员在整个代码库上工作,视图与模型的适当分离也会更加高效,因为基于最终用户反馈,用户界面通常在开发周期中经常发生变化,而且处于开发周期后期。 +MVVM模式试图获得MVC提供的功能性开发分离的两个优点,同时利用数据绑定的优势和通过绑定数据的框架尽可能接近纯应用程序模型。它使用绑定器、视图模型和任何业务层的数据检查功能来验证传入的数据。结果是模型和框架驱动尽可能多的操作,消除或最小化直接操纵视图的应用程序逻辑(如代码隐藏)。 + +## 5、MVVM的简易实现 + +#### 原理图 + +![](MVVM1.jpg) + +这个 MVVM 的实现,是通过 Observer、Dep、Watcher、Complie 四个组件组成,它们相互关联,相互影响,最终形成了数据的双向绑定功能: + +通过 Observer 来监听 data 的数据变化,并且提供了订阅某个数据变化的能力; +通过 Complie 来编辑 HTML 模版成 Document Fragment,然后解析其中的特殊标记(绑定的数据); + +#### Observer + +Observer 模块会自动的将 data 中的所有属性增加 getter 和 setter,让其具备监听对象属性变化的能力: + +``` +function observe(obj, vm) { + Object.keys(obj).forEach(function(key) { + defineReactive(vm, key, obj[key]); + }); +} + +function defineReactive(obj, key, val) { + var dep = new Dep(); + + Object.defineProperty(obj, key, { + get: function() { + if(Dep.target) { + dep.addSub(Dep.target); + } + + return val; + }, + set: function(newVal) { + if(newVal === val) { + return; + } + val = newVal; + + dep.notify(); + } + }); +} +``` + +#### Dep + +Dep 和 Watcher 是简单的观察者模式的实现,Dep 相当于一个订阅者,它会管理所有的观察者,并且有给观察者发送消息的能力: + +``` +function Dep () { + this.subs = []; +} + +Dep.prototype = { + addSub: function(sub) { + this.subs.push(sub); + }, + notify: function() { + this.subs.forEach(function(sub) { + sub.update(); + }) + } +} +``` + +#### Watcher + +Watcher 相当于一个观察者,当接收到订阅者的消息后,观察者会做出自己的更新操作: + +``` +function Watcher(vm, node, name, nodeType) { + Dep.target = this; + this.name = name; + this.node = node; + this.vm = vm; + this.nodeType = nodeType; + this.update(); + Dep.target = null; +} + +Watcher.prototype = { + update: function () { + this.get(); + if (this.nodeType == 'text') { + this.node.nodeValue = this.value; + } + if (this.nodeType == 'input') { + this.node.value = this.value; + } + }, + get: function () { + this.value = this.vm[this.name]; + } +} +``` + +#### Complie + +Complie 具备将 HTML 模版解析成 Document Fragment 的能力,并且会创建响应的 Watcher,让视图中绑定的数据产生变化: + +``` +function nodeToFragment(node, vm) { + var flag = document.createDocumentFragment(); + var child; + + while(child = node.firstChild) { + compile(child, vm); + console.log(child); + + flag.appendChild(child); + } + + return flag; +} + +function compile(node, vm) { + var reg = /\{\{(.*)\}\}/; + + if(node.nodeType === 1) { + var attr = node.attributes; + + for(var i = 0; i < attr.length; i++) { + if(attr[i].nodeName == 'v-model') { + var name = attr[i].nodeValue; + node.addEventListener('input', function(e) { + vm[name] = e.target.value; + }); + node.value = vm[name]; + node.removeAttribute('v-model'); + } + } + + new Watcher(vm, node, name, 'input'); + } + else if(node.nodeType === 3) { + if(reg.test(node.nodeValue)) { + var name = RegExp.$1; + name = name.trim(); + + new Watcher(vm, node, name, 'text'); + } + } +} +``` + +#### MVVM 构造函数 + +当 MVVM 对象初始化的时候会做两件事情:监听 data 所有属性的变化;解析 HTML 模版: + +``` +function MVVM(options) { + this.data = options.data; + var data = this.data; + + observe(data, this); + + var id = options.el; + var dom = nodeToFragment(document.getElementById(id), this); + + document.getElementById(id).appendChild(dom); +} + +var mv = new MVVM({ + el: 'app', + data: { + msg: 'hello world' + } +}); +``` + + + +# 二、WPF 窗体应用程序创建流程 + +## 1、掌握WPF窗体基本控件 + +##### (1)Button(按钮):表示 Windows 按钮控件,该按钮对 Click 事件做出反应。 + +常用属性介绍 Background:元素的背景色; Foreground:前景色; Width/Height:宽度/高度; + BorderBrush:元素边框颜色; BorderThickness:元素边框宽度; + Command:获取或设置在按下按钮时调用的命令。 + CommandBindings:获取与此元素关联的 CommandBinding 对象的集合。 CommandBinding 为此元素启用命令处理,并声明命令、命令的事件和由此元素附加的处理程序之间的链接。 + CommandParameter:获取或设置要传递给 Command 属性的参数。 + Content:获取或设置 ContentControl 的内容。 + ContentStringFormat:获取或设置一个撰写字符串,该字符串指定如果 Content 属性显示为字符串,应如何设置该属性的格式。 + ContentTemplate :获取或设置用于显示 ContentControl 内容的数据模板。 + FontFamily:字体名称; FontSize:字体大小; FontStretch:字体在屏幕上紧缩或加宽的程度; FontWeight:字体粗细; + ClickMode:获取或设置 Click 事件何时发生。ClikMode值有如下三种,具体解析如下: + Release:指定当按下和释放按钮时应引发Click 事件。 + Press:指定当按下按钮时应引发Click 事件。 + Hover:指定当鼠标悬停在控件上时应引发Click 事件。 + +##### (2)Label 文本标签 表示包含一段任意类型内容的控件。也可以叫标签控件。 + + Lable 常用属性 + Background:背景; Foreground前景色(字体颜色) + BorderBrush:用于描述控件的边框背景的画笔。 + BorderThickness:获取或设置控件的边框宽度。 + Content:获取或设置 ContentControl 的内容。 + FontFamily:获取或设置控件的字体系列。 + FontSize:获取或设置字号。 + FontStretch:获取或设置字体在屏幕上紧缩或加宽的程度。 + FontStyle:获取或设置字体样式。 + FontWeight:获取或设置指定字体的粗细。 + Width/Height:宽度/高度。 IsEnabled:使能是否可用。 Name:元素标识名称。 + Opacity:透明度。 Margin:元素的外边距。 + HorizontalAlignment/VerticalAlignment:获取或设置在父元素(如面板或项控件)中组合此元素时所应用的水平/垂直对齐特征。 + HorizontalContentAlignment/VerticalContentAlignment:获取或设置控件内容的水平/垂直对齐方式。 + +##### (3)TextBox :文本输入框控件,是WPF中最基本的文字输入控件。它允许最终用户在一行、对话输入、或多行编写,就像是个编辑器。 + +常用属性介绍 + Background:背景; BorderBrush:边框背景的颜色; BorderThickness:边框宽度; + CanRedo:是否可重做最新的撤消操作; CanUndo:是否可撤消最新的操作; + CaretIndex:获取或设置插入符号的插入位置索引。 + FlowDirection:获取或设置文本和其他用户界面 (UI) 元素在控制其布局的任何父元素内流动的方向。 + FontFamily:字体样式; FontSize:字体大小; FontStretch:字体在屏幕上紧缩或加宽的程度。 + HorizontalAlignment/VerticalAlignment:获取或设置在父元素中组合此元素时所应用的水平对齐特征/垂直对齐特征。 + HorizontalContentAlignment/VerticalContentAlignment:获取或设置控件内容的水平对齐方式/垂直对齐方式。 + HorizontalScrollBarVisibility/VerticalScrollBarVisibility:是否显示水平滚动条/垂直滚动条; + HorizontalOffset/VerticalOffset:获取和设置水平滚动条的位置/垂直滚动条的位置; + IsEnabled:使能,是否可用; IsReadOnly:对用户而言是否只读; + IsUndoEnabled:是否支持撤销功能; LineCount:文本总行数; + MaxLength:在文本框中手动输入的最大字符数。 + MaxLines/MinLines:最大可见行数/最小行数。 + Name:元素标识名称; Opacity:透明度; + SelectedText:文本框中当前选择的内容。 + SelectionBrush:突出显示选定文本的画笔。 + SelectionLength:文本框中当前选择的字符数。 + SelectionOpacity:选择文本的透明度。 + SelectionStart:当前选择的起始位置的字符索引。 + SelectionTextBrush:选中文本的颜色; + Text:文本框的文本内容。 + TextAlignment:文本框内容的水平对齐方式。 + TextWrapping:文本框中文本的换行方式。 + +##### (4)ListBox 是一个 ItemsControl,这意味着它可以包含任何类型的对象的集合 (,例如字符串、图像或面板) 。 + +​ 一个 ListBox 中的多个项是可见的,与仅 ComboBox具有所选项可见的项不同,除非 IsDropDownOpen 属性为 true。 该 SelectionMode 属性确定一次是否可以选择多个项 ListBox 。 +常用属性介绍 +​ FontFamily:字体系列; FontSize:字体大小; FontStretch:字体在屏幕上紧缩或加宽的程度;FontWeight:字体粗细; +​ Background:背景; BorderBrush:边框颜色; BorderThickness:边框宽度; Foreground:前景色; +​ Width/Height:宽度/高度; Name:元素标识名称; IsEnabled:使能,是否可用; Margin:外边距; +​ Opacity:透明度; Visibility:可见性; IsVisible:是否可见; FlowDirection:其子元素的流动方向; +​ LayoutTransform:在执行布局时应该应用于此元素的图形转换方式。 RenderTransform:元素的呈现位置的转换信息; +​ RenderTransformOrigin:由RenderTransform声明的任何可能呈现转换的中心点,相对于元素的边界。 +​ HorizontalAlignment/VerticalAlignment:在父元素中组合此元素时所应用的水平对齐特征/垂直对齐特征。 +​ HorizontalContentAlignment/VerticalContentAlignment:控件内容的水平对齐方式/垂直对齐方式。 +​ Items:获取用于生成 ItemsControl 的内容的集合。 +​ ItemsSource:获取或设置用于生成 ItemsControl 的内容的集合。 +​ SelectedIndex:获取或设置当前选择中第一项的索引,如果选择为空,则返回负一(-1)。 +​ SelectedItem:获取或设置当前选择中的第一项,或者,如果选择为空,则返回 null。 +​ SelectedItems:获取当前选定的项。 +​ SelectedValue:获取或设置通过使用 SelectedItem 而获取的 SelectedValuePath 的值。 +​ SelectedValuePath:获取或设置用于从 SelectedValue 获取 SelectedItem 的路径。 +​ SelectionMode:获取或设置 ListBox 的选择行为。 +​ SnapsToDevicePixels:获取或设置一个值,该值确定在呈现过程中,此元素的呈现是否应使用特定于设备的像素设置。 + +##### (5)DataGrid DataGrid 表示用于在可自定义的网格中显示数据的控件。 + + 常用属性介绍 + ActualHeight/ActualWidth:元素呈现的高度/宽度。 + CanSelectMultipleItems:获取或设置一个值,该值指示是否可以一次选择 MultiSelector 中的多个项。 + CanUserAddRows:获取或设置一个值,该值指示用户是否可在 DataGrid 中添加新行。 + CanUserDeleteRows:获取或设置一个值,该值指示用户是否可从 DataGrid 中删除行。 + CanUserReorderColumns:获取或设置一个值,该值指示用户能否通过用鼠标拖动列标题来更改列的显示顺序。 + CanUserResizeColumns/CanUserResizeRows:获取或设置一个值,该值指示用户是否可使用鼠标调整列宽/高度。 + CanUserSortColumns:获取或设置一个值,该值指示用户能否通过单击列标题对列进行排序。 + ColumnHeaderHeight:获取或设置列标题行的高度。 + Columns:获取一个集合,该集合包含 DataGrid 中的所有列。 + ColumnWidth:获取或设置 DataGrid 中列和标题的标准宽度和大小调整模式。 + CurrentCell:获取或设置具有焦点的单元格。CurrentColumn:获取或设置包含当前单元格的列。 + CurrentItem:获取与包含当前单元格的行绑定的数据项。 + DisplayMemberPath:获取或设置源对象上的值的路径,以用作对象的可视表示形式。 + HeadersVisibility:获取或设置用于指定行和列标题可见性的值。 + HorizontalGridLinesBrush:获取或设置用于绘制水平网格线的画笔。 + HorizontalScrollBarVisibility/VerticalScrollBarVisibility:水平/垂直滚动条可见性。 + RowBackground:获取或设置行背景的默认画笔。RowHeaderWidth:获取或设置行标题列的宽度。 + RowHeight:获取或设置所有行的建议高度。SelectedCells:获取当前选定单元格的列表。 + SelectedIndex:获取或设置当前选择中第一项的索引,如果选择为空,则返回负一(-1)。 + SelectedItem:获取或设置当前选择中的第一项,或者,如果选择为空,则返回 null。 + SelectedItems:获取在 MultiSelector 中选定的项。 + SelectedValue:获取或设置通过使用 SelectedItem 而获取的 SelectedValuePath 的值。 + SelectedValuePath:获取或设置用于从 SelectedValue 获取 SelectedItem 的路径。 + SelectionMode:获取或设置一个值,该值指示如何在 DataGrid 中选择行和单元格。 + SelectionUnit:获取或设置一个值,该值指示是否可以在 DataGrid 中选择行、单元格或两者。 + Items:获取用于生成 ItemsControl 的内容的集合。ItemTemplate:获取或设置用来显示每个项的 DataTemplate。 + ItemsPanel:获取或设置模板,该模板定义对项的布局进行控制的面板。 + ItemsSource:获取或设置用于生成 ItemsControl 的内容的集合。 + SnapsToDevicePixels:获取或设置一个值,该值确定在呈现过程中,此元素的呈现是否应使用特定于设备的像素设置。 + +##### (6)ComboBox 表示带有下拉列表的选择控件,通过单击控件上的箭头可显示或隐藏下拉列表。也叫下拉列表控件。 + +常用属性介绍 + FontFamily:字体系列; FontSize:字体大小; FontStretch:字体在屏幕上紧缩或加宽的程度;FontWeight:字体粗细; + Background:背景; BorderBrush:边框颜色; BorderThickness:边框宽度; Foreground:前景色; + Width/Height:宽度/高度; Name:元素标识名称; IsEnabled:使能,是否可用; Margin:外边距; + Opacity:透明度; Visibility:可见性; IsVisible:是否可见; FlowDirection:其子元素的流动方向; + LayoutTransform:在执行布局时应该应用于此元素的图形转换方式。 RenderTransform:元素的呈现位置的转换信息; + RenderTransformOrigin:由RenderTransform声明的任何可能呈现转换的中心点,相对于元素的边界。 + HorizontalAlignment/VerticalAlignment:在父元素中组合此元素时所应用的水平对齐特征/垂直对齐特征。 + HorizontalContentAlignment/VerticalContentAlignment:控件内容的水平对齐方式/垂直对齐方式。 + Items:获取用于生成 ItemsControl 的内容的集合。ItemTemplate:获取或设置用来显示每个项的 DataTemplate。 + ItemsPanel:获取或设置模板,该模板定义对项的布局进行控制的面板。 + ItemsSource:获取或设置用于生成 ItemsControl 的内容的集合。 + SelectedIndex:获取或设置当前选择中第一项的索引,如果选择为空,则返回负一(-1)。 + SelectedItem:获取或设置当前选择中的第一项,或者,如果选择为空,则返回 null。 + SelectedItems:获取当前选定的项。 Text:获取或设置当前选定项的文本。 + SelectedValue:获取或设置通过使用 SelectedItem 而获取的 SelectedValuePath 的值。 + SelectedValuePath:获取或设置用于从 SelectedValue 获取 SelectedItem 的路径。 + SelectionBoxItem:获取在选择框中显示的项。SelectionBoxItemTemplate:获取选择框内容的项模板。 + SnapsToDevicePixels:获取或设置一个值,该值确定在呈现过程中,此元素的呈现是否应使用特定于设备的像素设置。 + IsDropDownOpen:获取或设置一个值,该值指示组合框的下拉部分当前是否打开。 + IsEditable:获取或设置一个值,该值指示启用或禁用 ComboBox 的文本框中的文本编辑。 + IsReadOnly:获取或设置启用仅限选择模式的值,在此模式中,可选择但不可编辑组合框中的内容。 + +## 2、熟悉具体应用创建流程 + +##### 第一步,创建WPF应用程序项目 + +打开Visual Studio 2022 ,选择“*File—>New—>Project*”。在“Create a new project”对话框中选择“WPF Application”,修改名称为自己项目的名称,然后点击“Create”按钮,便成功创建了一个“WPF应用程序如下图: + +![](WPF1.jpg) + +##### 第二步,熟悉项目主要引用类库、操作窗口、代码文件 + +新创建的项目所引用的公共类库如下。如下图:(“WPF APP”会在“References”里面自动添加下图中所示的 PresentationCore、PresentationFramework、WindowsBase三大核心程序集) + +![](WPF2.jpg) + +除此之外,WPF主要核心文件分别为:App.xaml:设置应用程序的起始文件与资源 ;App.xaml.cs:用于处理WPF程序的相关;MainWindows.xaml:程序界面与XAML设计文件 + +![](WPF3.jpg) + +![](WPF4.jpg) + +##### 第三步,编写XAML文件,设置窗体网格布局 + +1、Class属性指定了负责实现窗体的那个类的完全限定名称。在本例中为MainWindow,位于WpfApp1命名空间中。其它的暂时不管。 + +除了设计窗口,XAML窗口 还有解决方案资源管理器和属性窗口(都可以在视图中找到)。将这四个窗口全部打开。属性窗口顾名思义可以更改选中控件的属性。 + +2、更改窗体标题栏中显示的文本 +可以直接在XAML代码 Title=“MainWindow” Height=“470” Width=“600”> 中更改Title的值 +或者在设计视图中单击MainWindow窗体,在属性窗口找到Title属性,输入给定的名称,从而改变窗体标题栏中显示的文本。 +3、Grid 面板非常灵活,但也能变得很复杂,咱们把它想象成一个单元格,可以把控件放入这个单元格中,在本例中只会使用一个单元格。 +4、先拖一个按钮到窗体中 +单击VS左边工具箱 找到button控件 点击拖到窗体中 +检查XMAL 窗格中的代码发现多了一行 + +``` +