VB.net学习笔记十七XAML




一、声明式编程

前面学的大多都是命令式或过程式编程,须具体描述某个功能的过程、算法,怎么实现。


命令式编程:命令“机器”如何去做事情(how),这样不管你想要的是什么(what),它都会按照你的命令实现。
声明式编程:告诉“机器”你想要的是什么(what),让机器想出如何去做(how)。

简单地说:声明式编程要的是“结果”,命令式编程要的是“过程”

例如:sql语句就是声明式,它只说明需要的结果,如:表中男性最高成绩的前三名,至于怎么实现,比如怎么过虑男性

怎么排序,怎么取得前三名,它都不关心,它只要结果。

而命令式编程则必须描述怎么过滤男性、怎么排序、怎么取得前三名。

通俗的说,声明式编程更象是一位领导,它只须交待给下属,他要的一个结果,而不去关心怎么去完成的这个过程。

命令式编程更象是一位下属,它得具体去操作每个细节,怎么实现,最后才得出结果。

VB.net是命令式语言,但也包含一些声明式结构。比如Handler子句就是声明式结构。

XAML语言比较接近纯粹的声明式语言,它仅关注结果或当前状态,而不关注如何实现。


为什么要有声明式语言?

用声明式语言能简单地说明要的结果,当这个语言(XAML)传到另一个解读的程序时,它会根据这个结果,来具体实现。

于是就把结果与实现分离。可以想到的是程序的传输体积小了,编程更标准化、更高效,因为结果的实现都是由标准地进行

实现。


文件-》新建项目,选择WPF应用程序,建立ProVB_XAML程序:


界面如上。

窗体的XAML如下:

<Window x:Class="MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
    <Grid>
        
    </Grid>
</Window>


双击解决方案中Application.xaml,可以看到:
<Application x:Class="Application"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    StartupUri="MainWindow.xaml">
    <Application.Resources>
        
    </Application.Resources>
</Application>

注意的是下面是一个语句中,后面都是
<Application x:Class="Application"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    StartupUri="MainWindow.xaml">

xmlns是XML Namespaces的缩写,即XML命名空间。

这四个属性中:xmlns和xmlns:s分别是指的两个命名空间。认的命名空间是指xmlns所指的内容

但要用另一个怎么办?用xmlns:x来指明另一个,这样要使用这个命名空间的内容时就可以用前缀x:来指代。

于是没有前缀(省略)的是指第一个,用了x:的是指的是第二个。


它只是定义了应用程序环境,后面几个都是它的结节,最后一个表示下步打开的是MainWindow.xaml文件

Resource里面描述如何使用XAML声明的对象的属性,如控件的颜色、形状、和行为等。







二、XAML语言基础


前面从感官上认识了声明式编程与XAML,再看看XAML几个重要概念

(具体学习www.w3schools.com)



1、XAML子集

XAML还可以被用于其它平台来表示非.net对象,XAML有以下几个子集:

WPF XAML 描述WPF内容的元素,如矢量图形、控件以及文档。

XPS XAML 是WPF XAML的一部分,为格式化的电子文档定义了一种XML表示方式。(前面说过可以减小传递体积)

Silvelight XAML 用于Silverlight程序的WPF XAML子集(主要用于二维图形、动画音频、视频)

WF XAML 描述Windows工作流(WorkFlow)内容的元素。



2、XAML编译

XML主要用于传递数据,但没压缩。而WPF使用BAML(binary Application MarkuP Language二进制应用程序标记语言)

它实际上是XAML的二进制表示,更减小了体积。

不必担心如何由XAML转为BAML,编译器会在后台自动执行,当然也可以不编译(比如用户界面须要自定义时)



3、XAML标准

(1)XAML中所有元素都映射为一个.net类的实例。元素的名称也完全对应于类名。

如元素<Button>指示WPF创建一个Button对象。

(2)与XML一样,可在一个元素中嵌套另一个元素。

<Grid>

<Button>

.....

</Button>

</Grid>

(3)可通过特性(Attribute)来设置每个类的属性(Property)。




4、顶级元素(根)

与XML一样,XAML只能使用一个顶级元素:

<Window x:Class="MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
    <Grid>
        
    </Grid>
</Window>

上面顶级元素就是Window。


顶级元素只能使用下面的:

Window元素

Page元素(与Window元素类似,它仅用于可导航的应用程序)

Application元素(它定义应用程序资源和启动设置)




5、XAML的名称空间

每个元素生成时使用的名称空间是不一样,要引用各个元素的空间显得非常烦扰和混乱,怎么有效的把它们组成到一个统一的

名称空间中来,使得简捷有效呢?


答案是用另外的一个名称空间来包含上面杂乱的空间。于是形成了下面两个统一的空间


XMAL使用两个名称空间:

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

(1)http://schemas.microsoft.com/winfx/2006/xaml/presentation

这是WPF的核心名称空间,它包含了所有WPF类,包括用于构建用户界面的控件。它是认的名称空间,

即省略前缀时,就是指的是这个名称空间

(2)http://schemas.microsoft.com/winfx/2006/xaml

这是XAML名称空间。它包含各种XAML实用特性,这些特性(Attribute)会影响文档的解释方式。

这个名称空间被映射为前缀x,意思是x是一个别名,指代的是这个空间,只要前缀用了x:就说明用的是这个空间。

使用形式如<x:ElementName>


注意:XML名称空间通常用的是URL字符,但这并不是网址,用它可以区别是Microsoft公司而不是其它组织,因为

schemas.com域是由Microsoft公司所拥有的,只有微软会在XML空间名称中使用它。


通过名称空间(命名空间)XAML解析器可以找到正确的类,如查找Window和Grid元素时,会先查认WPF的名称空间,

再查找.net名称空间,直到找到System.Windows.Window类和System.Windows.Controls.Grid类为止。




6、代码隐藏类

通过XAML就可以构造用户界面,但这就是外观还需要一定的功能,就需要一个连接包含实现代码方法。怎么实现?

XAML通过使用Class特性来完成:

<Window x:Class="WindowsApplication.Windows1"

Class用了前缀x:,表示是XAML语言中更通用的部分。

Class特性告诉XAML解析器使用指定的名称生成一个新类,该类继承XML元素命名的类。即:

上面创建了一个名为Window1的新类,该类继承自Window基类。

关键:

通过Partial Class部分类,把一个类分成两个或多个,并在编译过的程序集中把这些独立的部分融合成一起,就形成 了

界面与代码的组合。






三、XML语句


XAML名称空间中的3类XML语句:特性、标记扩展、XAML指令

注意:特性(Attribute)与属性(Property)两者相似,但又不同。


1、特性

XML中特性表示与XML节点相关的命名属性

节点对象可能有几个特性,如Name、Margin、Text,

特性只存在于节点的定义中,不包含在XML的节点中:

x:Class 配置 XAML 编译,在标记代码隐藏之间连接分部类。代码分部类在一个独立的代码文件中定义,

标记分部类由代码生成过程在 XAML 编译期间创建。

<object x:Class="namespace.classname"...>
  ...
</object>

x:FieldModifier 修改 XAML 编译行为,使指定对象引用的字段被定义有 public 访问权限而不是认的 private 行为。
<object x:FieldModifier="public".../>

x:ClassModifier 在同时提供了 x:Class 的情况下,修改 XAML 编译行为。 具体而言,不必创建有 Public 访问级别

认值)的 class 分部类,提供的 x:Class 是以 NotPublic 的访问级别创建的。 此行为会影响生成

的程序集中的类的访问级别。

 <object x:Class="namespace.classname" x:ClassModifier="NotPublic">
   ...
</object>



x:Key 唯一标识作为资源被创建和引用的元素,这些资源存在于一个 ResourceDictionary 中。

<ResourceDictionary>
  <object x:Key="stringkeyvalue".../>
</ResourceDictionary>


x:Name 唯一标识对象元素,可方便从代码隐藏或一般代码中访问已实例化的对象。应用于支持的编程模型之后,

x:Name 可视为等效于持有一个对象引用(由一个构造函数返回)的变量。

<object x:Name="XAMLNameValue".../>


x:Subclass 在同时提供了 x:Class 的情况下,修改 XAML 标记编译行为。 不必根据 x:Class 类创建分部类,而是将

提供的 x:Class 创建为中间类,然后提供的派生类应基于 x:Class。

 <object x:Class="namespace.classname" x:Subclass="subclassNamespace.subclassName">
   ...
</object>


x:Shared 当设置为 false 时,会修改 WPF 资源检索行为,以便特性化资源请求为每个请求创建一个新实例,而不是

所有请求共享同一个实例。

<ResourceDictionary>
  <object x:Shared="false".../>
</ResourceDictionary>


x:TypeArguments 将泛型的约束类型参数传递给泛型类型的构造函数

 <object x:TypeArguments="typestring" .../>







2、标记扩展

允许包含格式,体现Extensible Application XML中的Extensible(扩展)

x:Array 在XAML里创建一个数组。使用Array扩展创建数组很容易,但在词法上和其他XAML扩展不同,它不需要使用大括号"{}",

原因在于Array里面含有多个元素。.

<x:Array Type="typeName">
  arrayContents
</x:Array>


x:Null 指定 null 作为通过一个 XAML 属性设置的属性的值。
<object property="{x:Null}" .../>


<object>
  <object.property>
    <x:Null />
  </object.property>
</object>




x:Reference 引用在 XAML 标记中其他地方声明的实例。 参考涉及元素的 x:Name。
<object property="{x:Reference instancexName}" .../>
<object>
  <object.property>
    <x:Reference Name="instancexName"/>
  </object.property>
</object>




x:Static 按值引用以符合 公共语言规范 (CLS) 的方式定义的任何静态代码实体。 引用的静态属性可以用来提供在 XAML 中的属性的值。
<object property="{x:Static prefix:typeName.staticmemberName}" .../>



x:Type 提供 CLR Type 对象,该对象是指定的 XAML 类型的基础类型。
<object property="{x:Type prefix:typeNameValue}" .../>


<x:Type TypeName="prefix:typeNameValue"/>






3、XAML指令
XAML一般不支持嵌入其它XML数据或代码,但可以通过两个指令做到:
x:Code 允许在 XAML 生产内放置代码。 这样的代码既可由任何编译 XAML 的 XAML 处理器实现编译,也可以留在 XAML 产品中以备

后用,例如由运行时解释。

<x:Code>
   // code instructions,usually enclosed by CDATA...
</x:Code>



x:XData 在 XAML 生产中开启 XML 数据岛的放置。 x:XData 中的 XML 元素不应由 XAML 处理器处理,就像它们属于作用的

认 XAML 命名空间或任何其他 XAML 命名空间的一部分。 x:XData 可包含任意格式正确的 XML。

<x:XData>
  <elementDaTaroot>
    [elementData]
  </elementDaTaroot>
</x:XData>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强制返回为文本 -------------------------------- 数字类型的格式化 --------------------------------     固定格式参数:     General Number 普通数字,如可以用来去掉千位分隔号     format$("100,1
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办法, Format 或者FormatDateTime 竟然结果和系统设置的区域语言的日期和时间格式相关。意思是尽管你用诸如 Format(Now, "MM/dd/yyyy"),如果系统的设置格式区域语言的日期和时间格式分隔符是"-",那他还会显示为 MM-dd-yyyy     只有拼凑: <%response.write
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace My ‘全局错误处理,新的解决方案直接添加本ApplicationEvents.vb 到工程即可 ‘添加后还需要一个From用来显示错误。如果到这步还不会则需要先打好基础啦 ‘======================================================== ‘以下事件
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用的爽呀,这篇文章写与2011年,看来我以前没有认真去找这个方法呀。 https://blog.csdn.net/chzjxgd/article/details/6176325 金蝶K3 BOS的插件官方是用VB6编写的,如果  能用.Net下的语言工具开发BOS插件是一件很愉快的事情,其中缘由不言而喻,而本文则是个人首创,实现在了用V
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选中的单元格进行处理 Dim m As Range, tmpStr As String, s As String Dim x As Integer, y As Integer, subStr As String If MsgBox("确定要分列处理吗?请确定分列的数据会覆盖它后面的单元格!", _
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single) 2 Dim path As String, hash As String 3 For Each fil
  Imports MySql.Data.MySqlClient Public Class Form1 ‘ GLOBAL DECLARATIONS Dim conString As String = "Server=localhost;Database=net2;Uid=root;Pwd=123456;" Dim con As New MySqlConnection
‘導入命名空間 Imports ADODB Imports Microsoft.Office.Interop   Private Sub A1() Dim Sql As String Dim Cnn As New ADODB.Connection Dim Rs As New ADODB.Recordset Dim S As String   S = "Provider=OraOLEDB.Oracl
Imports System.IO Imports System.Threading Imports System.Diagnostics Public Class Form1 Dim A(254) As String    Function ping(ByVal IP As Integer) As String Dim IPAddress As String IPAddress = "10.0.
VB运行EXE程序,并等待其运行结束 参考:https://blog.csdn.net/useway/article/details/5494084 Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long Pr
今天碰到一个问题,登陆的时候,如果不需要验证手机号为空,则不去验证手机号 因为登陆的时候所有的验证信息都存放在一个数组里 Dim CheckUserInfo() As String ={UserBirthday, SecEmail, UserMob, UserSex, RealNameFirst, RealName, CheckCardID, CheckCardType, Contactemail
在VB6.0中,数据访问接口有三种: 1、ActiveX数据对象(ADO) 2、远程数据对象(RDO) 3、数据访问对象(DAO) 1.使用ADO(ActiveX Data Objec,ActiveX数据对象)连接SQL Server 1)使用ADO控件连接 使用ADO控件的ConnectionString属性就可以连接SQL Server,该属性包含一个由分号分隔的argument=value语
注:大家如果没有VB6.0的安装文件,可自行百度一下下载,一般文件大小在200M左右的均为完整版的软件,可以使用。   特别提示:安装此软件的时候最好退出360杀毒软件(包括360安全卫士,电脑管家等,如果电脑上有这些软件的话),因为现如今的360杀毒软件直接会对VB6.0软件误报,这样的话就可能会在安装过程中被误报阻止而导致安装失败,或者是安装后缺乏很多必须的组件(其它的杀毒软件或安全卫士之类的
Private Sub Form_Load() Call conndb End Sub Private Function conndb() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim strCn, sql As String Dim db_host As String Dim db_user As String
  PPSM06S70:  Add  moddate  EDITSPRINTJOB:  MAX(TO_CHAR(ETRN.MODDATE, ‘yyyy/mm/dd/HH24:MI AM‘)) ACTUAL_SHIPDATE   4.Test Scenario (1) :Query SQL Test DN:8016578337 SELECT CTRN.TKCTID TRUCK_ID,        
  沒有出現CrystalReportViewer時,須安裝CRforVS_13_0. 新增1個數據集,新增1個數據表,添加二列,列名要和資料庫名一樣. 修改目標Framework 修改app.config, <startup >改成<startup useLegacyV2RuntimeActivationPolicy ="true">  CrystalReport1.rpt增加數據庫專家 在表單
Imports System.Threading Imports System Public Class Form1 Dim th1, th2 As Thread Public Sub Method1() Dim i As Integer For i = 1 To 100 If Me.Label1.BackColor =
Friend Const PROCESS_ALL_ACCESS = &H1F0FFF = 2035711 Friend Const PROCESS_VM_READ = &H10 Friend Const PROCESS_VM_WRITE = &H20 Friend Const PAGE_READONLY = &H2 Friend Const PAGE_READWRITE = &H4 Friend
以下代码随手写的 并没有大量测试 效率也有待提升 如果需要C#的请自行转换 Function SplitBytes(Data As Byte(), Delimiter As Byte()) As List(Of Byte()) Dim i = 0 Dim List As New List(Of Byte()) Dim bytes As New
Imports System.Data.SqlClient Public Class Form1 REM Public conn1 As SqlConnection = New SqlConnection("server=.; Integrated Security=False;Initial Catalog= mydatabase1; User ID= sa;password")