首页 > 其他分享 >01 WPF-HelloWorld

01 WPF-HelloWorld

时间:2023-11-15 10:58:19浏览次数:45  
标签:控件 01 XAML 元素 HelloWorld 设置 WPF xxx

01 HelloWorld

简介

WPF全称:Windows Presentation Foundation

Windows用户界面框架,统一的编程模型、语言和框架,做到了界面设计与后端开发分离。

特点:

  1. 呈现效果不受分辨率的影响
  2. 基于DirectX 3d技术,可以做出炫酷的界面
  3. 提供UI框架,集成了矢量图形、流动文字支持、3d视觉效果和控件模型框架
  4. UI与业务逻辑彻底分离,UI-XAML描述(底层wpf引擎是把元索解释成对应的对象)
  5. xp server2003到window7及以后的操作系统版本都可以支持
  6. 基于数据驱动,数据是核心

什么是 XAML

XAML:eXtensible Application Markup Language 可拓展的应用程序标记语言

XAML 是⼀种声明性标记语⾔。 应⽤于 .NET Core 编程模型时,XAML 简化了为.NET Core 应⽤创建 UI 的过程。
XAML ⽂件是通常具有 .xaml 扩展名的 XML ⽂件。 可通过任何 XML 编码对⽂件进⾏编码,但通常以 UTF-8 编码。

对象元素语法:单标签格式 和 双标签格式(可嵌⼊其他的标签)

元素嵌套关系

⼀个 XAML ⽂件只能有⼀个根元素,这样才能同时作为格式正确的 XML ⽂件和有效的 XAML ⽂件。
对于典型 WPF ⽅案,可使⽤在 WPF 应⽤模型中具有突出意义的根元素(例如,⻚⾯的 Window 窗体 或 Page 页面)。

在根标签下⾯有且只能有⼀个二级标签,一般使用一个容器标签,Grid​就是一个容器标签。在二级标签⾥⾯我们可以写多个三级 四级标签。

WPF 和 XAML 命名空间声明

在winform中引入命名空间需要使用using xxx;​,xaml中没有那种写法,需要在根元素上添加属性来引入命名空间,其中有几个命名空间是xaml​运行所需的依赖,默认就会添加

xmlns:xxx

XAML中使用 xmlns:xxx="xxxx"​引入命名空间,其中xxx可以是自己定义的名字,后面是命名空间的名字

代码中首先有以下几个命名空间,他们的作用是给xaml编译器看的,用来引导XAML代码将XAML代码编译为CLR代码

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"

x:Class

这个Attribute是告诉XAML编译器将XAML编译器编译的结果和后台编译结果的哪一个类进行合并,使用x:Class有以下几点要求:

  • 这个Attribute只能用于根节点。
  • 使用x:Class的根节点的类型要与x:Class的值所指示的一致。
  • x:Class的值所指示的类型在声明的时候必须使用partial关键字。

xmlna:xx="clr-namespace:xxxx"

用于引入本地的命名空间,也就是我们自己创建的命名空间

添加控件

添加控件的方案有三种

手动从工具箱拖拽控件

工具箱 => 拖拽 => 到指定位置

右键 => 属性 => 设置控件的外观

手动拖拽控件的做法本质上也是书写XAML,只是由编辑器自动帮我们完成了而已

手写XAML代码(重要)

手写XAML是编写wpf控件的主要方式,写法类似xml,每一个控件就是一个对象,如<Label></Label>​就是一个new Label()​,控件上的xxx="xxx"​称之为属性Attribute​,就是设置该对象的属性property,等价于label.xxx = "xxx"

<!--Label:表示控件的文本标签,并提供访问密钥支持。-->
<!--Label的一个继承关系:Object -> DispatcherObject -> DependencyObject -> Visual -> UIElement -> FrameworkElement -> Control -> ContentControl -> Label-->
<!--可以写成双标签,也可以写成单标签-->
<Label Content="哈哈" Background="#f55512" Width="50" Height="50" Cursor="Pen"  />
<Label Content="abc手动阀十分的" Background="AliceBlue"
       VerticalAlignment="Bottom" HorizontalAlignment="Right"
       Margin="50,80,90,100"
       FontSize="30" Foreground="Blue" FontWeight="Bold" FontFamily="微软雅黑" FontStyle="Italic">
</Label>

上例中用到了一些属性,简述一下

  • Background:设置背景颜色

  • VerticalAlignment/HorizontalAlignment:设置垂直或者水平对齐方式

  • Width/Height:设置元素的宽高

  • Margin:获取或设置元素的外边距。默认值是所有属性都等于 0。

    • 边距是此元素与其他元素之间的空间,当布局创建用户界面 (UI) 时,这些元素将相邻。

    • 共享元素可以是 (对等元素,例如公共父控件) 集合中的其他元素,也可能是此元素的父元素

    • 布局中同级元素的边距是相加的;例如,相邻边缘上边距设置为 30 的两个相邻元素之间将具有 60 个单位的空间。

    • 用法:<object Margin="left,top,right,bottom"/><object Margin="leftAndRight,topAndBottom"/><object Margin="all"/>

    • 注意:Margin的设置和HorizontalAlignment, VerticalAlignment​属性有关,当HorizontalAlignment设定left时,margin取left的值,right的值就不起作用了。如果定义right,那么margin取right的值,left的值就没有作用了,verticalAlignment同理

    • 如果没有设置HorizontalAlignment, VerticalAlignment

      • 如果控件没有设置尺寸,则设置对应方向的边距,并调整控件大小
      • 如果控件设置了尺寸,则平方剩余空间,并设置对应方向大于另一方向对象的值,如:<Label Background="Blue" Width="200" Height="39" VerticalAlignment="Center" Margin="10,0,0,0">​,则左边比右边边距大10
  • FontSize:设置字体大小

  • Foreground:获取或设置一个用于描述前景色的画笔。

  • FontWeight:获取或设置指定字体的粗细。

  • FontFamily:获取或设置控件的字体系列。

  • FontStyle:获取或设置字体样式。

在.cs代码中添加控件

我们经常也会需要在代码中动态的添加控件,如:根据数据库查询结果创建多个控件并展示

  1. 给要添加子控件的控件添加一个x:Name​属性,表示该控件的名字,这样才能在代码中获取它
  2.  for (int i = 0; i < 10; i++)
     {
         Label label = new Label(); // 创建控件
         label.Content = $"第{i}个元素";
         panel.Children.Add(label);  // 添加到控件中,panel为对应控件的Name值
     }
    

简单数据绑定

wpf最大的优势在于它的数据绑定十分简单,如:根据某个控件的输入内容控制另一个控件的文本,winfrom中需要好几句代码,WPF可以这样做

<!--使用Binding绑定该控件的属性值,ElementName设置要绑定哪个控件,Path设置绑定该控件的哪个属性-->
<TextBlock TextWrapping="Wrap" Text="{Binding ElementName=text, Path=Text}"/>
<TextBox x:Name="text" Height="100"/>

标签:控件,01,XAML,元素,HelloWorld,设置,WPF,xxx
From: https://www.cnblogs.com/laoguonana/p/01-helloworld-1smjdx.html

相关文章

  • [DDCTF2018](╯°□°)╯︵ ┻━┻
    (╯°□°)╯︵┻━┻50pt(╯°□°)╯︵┻━┻d4e8e1f4a0f7e1f3a0e6e1f3f4a1a0d4e8e5a0e6ece1e7a0e9f3baa0c4c4c3d4c6fbb9b2b2e1e2b9b9b7b4e1b4b7e3e4b3b2b2e3e6b4b3e2b5b0b6b1b0e6e1e5e1b5fd首先看它的长度,有134,那就排除md5和sha1加密。可能是十六进制的字符串。直接转字符......
  • 01-安装及初始化
    01-安装及初始化安装及初始化1.程序安装下载地址本笔记针对windows系统,下同安装过程将软件安装至一合适文件夹,路径不能有中文即可安装过程中选项均使用默认项即可。使用Github通常会使用远程仓库存放代码,所以需要登陆github,注册github帐号,填写合适用户名、邮......
  • P3160 [CQOI2012] 局部极小值
    [CQOI2012]局部极小值-洛谷题目详情-[cqoi2012]局部极小值-BZOJbyHydroOJ这题不值得单独写一个博客的,但我竟然没想出来,所以还是写吧\(QwQ\)又是我不擅长的找性质。性质:从小到大填数。当一个非局部最小值周围的所有局部最小值格子都被填了数时,这个位置才能填数。......
  • Java流程控制01:用户交互Scanner
    一、用户交互ScannerublicclassDemo01{publicstaticvoidmain(String[]args){//创建一个扫描器对象,用于接收键盘数据Scannerscanner=newScanner(System.in);System.out.println("使用next方式接受:");//判断用户有没有输......
  • net/http 01
    用net/http包可以快速起一个web服务点击查看代码packagemainimport("fmt""net/http")funchelloWorld(whttp.ResponseWriter,req*http.Request){_,err:=fmt.Fprintf(w,"Helloworld!")iferr!=nil{fmt.Pr......
  • Oracle启动数据库报ORA-01102解决办法
    1.机器启动之后登录服务器使用sqlplus/assysdba登录数据库发现数据库并没有启动之前把数据库服务添加过开机自启动![在这里插入图片描述](https://img-blog.csdnimg.cn/c25a5e40f3274621b708d974065bf650.png)2.使用startup命令启动数据库报错了SYS@orcl>startup;ORACLE例程已......
  • 01. Kubernetes - 容器运行时 Containerd
    首页新闻博问会员闪存班级    博客园 首页 新随笔 联系 订阅 管理随笔-27  文章-0  评论-4  阅读- 538501.Kubernetes-容器运行时Containerd DockerDocker从1.11版本开始,其容器的......
  • P3643 [APIO2016] 划艇
    [APIO2016]划艇-洛谷题目详情-[Apio2016]赛艇-BZOJbyHydroOJ看着个题目以为是变换考虑方向,但想了半天完全没有思路先考虑暴力。设\(dp_{i,j}\)表示前\(i\)个数,第\(i\)个数强制选,值为\(j\)的方案数容易得到转移方程:\[dp_{i,j}=\begin{cases}\sum\li......
  • 「NOIP2014」解方程 题解
    思路首先我们可以观察到\(n\)和\(m\)与\(a_i\)相比小的很多,所以我们可以考虑直接暴力求解但是\(a_i\)太大了,所以如果需要直接计算的话需要全程使用高精度算法。因为高精度算法代码量有大速度又慢我们可依考虑将\(a_i\)转化为一个极大的指数取模的结果,因为只有是模数的......
  • P5513 [CEOI2013] Board CWOI1114C
    70分做法非常容易想到,使用高精度对经过的点编号,令\(pos\)为点的编号,初始为\(1\),则:1:\(pos<<=1\)2:\(pos<<=1|1\)U:\(pos>>=1\)L:\(pos--\)R:\(pos++\)#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;constintN=1e5+5,i......