WPF_1

剖析最简单的WPF程序

什么是项目模板

首先新建一个WPF项目模板

直接运行:

最简单的WPF程序

解决方案就对应着客户的一个需求,解决方案中可以含多个项目,每个项目编译后的结果是一个程序集Assembly。

现在来看下MainWindow.xaml中代码

cs 复制代码
<Window x:Class="WpfApp1.MainWindow"
        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:WpfApp1"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">//window对象的属性,设置窗口的大小名字
    <Grid>

    </Grid>
</Window>

这是标签性语言,有个Window标签就会生成一个Window对象.

代码中xmlns,表示告诉编译器识别到后面的http字符串,就引入一系列类库(名称空间)到MainWindow.xaml中。起到简化引入类库的操作。

代码中有xmlns:x,xmlns:d等等,也就是冒号后跟一个字符。这其实就是它的名字。而第一个xmlns是无需有名字的。起名字的作用在于用某个xmlns的东西,就要先写它的名字。而不写名字的,系统知道就是来自第一个xmlns。

那么第一行代码<Window x:Class="WpfApp1.MainWindow",就知道Window是来自第一个xmlns,而x:Class表示Class是来自名为x的xmlns。这段代码的意思是:该.xaml文件编译结果会放在WpfApp1的MainWindow中。

而WpfApp1.MainWindow.cs代码中,partial也表明是部分类。结论是这两个文件是一个类MainWindow的两部分

cs 复制代码
namespace WpfApp1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }
}

用户界面的树形结构

浅析用户界面的树形结构

用户界面是指用户与应用程序打交道的地方,WPF就是图型的用户界面,结构是树形的。而其他的如winform是平面结构的。

这是一个WPF的结构,像树一样,根结点然后叶节点,一层层下去的。由一个根 开枝盛叶。

在XAML中为对象属性赋值

首先xaml文件中代码是声明性语言编写,声明性意味着每个标签就对应着一个对象,对象存储数据有字段和属性,向外暴露数据是用属性。因为字段是没法检验数据的,只能单纯存储数据。

在xaml文件中,能以以下三种形式为对象赋值:

1、以Attribute=Value形式赋值

是最方便的形式

cs 复制代码
Height="450" Width="800"

缺陷在于无法赋复杂的值

cs 复制代码
 <Path Data="M 0,0 L 200,100 L 100,200 Z" Stroke="Black" Fill="Red"/>//最复杂形式

F12查看Data定义,发现它是Geometry类型属性,它是怎么映射过来的,可以与字符串对应 ?

在后台cs文件中新建一个human类

cs 复制代码
 public class Human //声明一个human类
 {
     public string Name { get; set; }
     public Human Child { get; set; }//如果一个human具有child对象,那么child也有自己的对象
 }

然后再xaml文件中操作:

cs 复制代码
 xmlns:local="clr-namespace:HappyWPF"//引入该程序集的名称空间,这样才能用human类
cs 复制代码
<Windows.Resource>
<local:Human x:Key="human" Name="Tim"/>
</Windows.Resource>
//将human以window的一个资源的形式声明出来,
//每个wpf程序以一个资源字典的形式去维护一系列资源

资源字典检索自己内容时,是靠索引的,上方x就是索引。

cs 复制代码
<Button Content="Show!" Width="120" Height="30" Click="Button_Click" />

Click是事件处理函数,右击进入事件处理函数当中。

cs 复制代码
private void Button_Click(object sender, RoutedEventArgs e)
{
    Human human=this.FindResource("human")as Human;//检索资源中内容,findresource是object型,as成Human型,不成功则为null
    if (human != null) {
        MessageBox.Show(human.Name);//检索当中内容,并且返回名字
    }

}

将字符串类型数据转换成其他数据类型原理:

2、以属性标签形式赋值

现在想在botton按钮中加一个绿色的小方块

小方块代码如下:

cs 复制代码
<Rectangle Width="20" Height="20" Stroke="DarkGreen"Fill="LawnGreen">

用第一种赋值方式是行不通的。采用属性标签

cs 复制代码
  <Button Width="120" Height="30">
      <Button.Content>
          <Rectangle Width="20" Height="20" Stroke="DarkGreen"Fill="LawnGreen"/>
      </Button.Content>
  </Button>
3、以标签扩展赋值

与第一种赋值方式很像,只不过它赋的东西带花括号。而且常用的就只有几个

先看下以第一种赋值形式赋值:

cs 复制代码
<TextBlock Height="24"Width="123"Background="LightBlue" Text="Hello"/>

现在以标签扩展赋值:

cs 复制代码
//引入字符串名称空间
xmlns:sys="clr-namespace:System;assembly=mscorlib"

//创建资源
 <Window.Resources>
     <sys:String x:Key="stringHello">
      Hello WPF!
     </sys:String>
 </Window.Resources>

//利用标签扩展使用资源
 <TextBlock Height="24"Width="123"Background="LightBlue" Text="{StaticResource ResourceKey=stringHello}"/>
相关推荐
猫霸1 天前
WPF静态资源StaticResource和动态资源DynamicResource有什么区别,x:Static又是什么意思?
分布式·c#·.net·wpf
wqq10271 天前
WPF 从Main()方法启动
wpf
明耀1 天前
WPF ListBox双击事件
wpf
wqq10271 天前
WPF 依赖注入启动的问题
wpf
wqq10271 天前
WPF 使用 DI EF CORE SQLITE
sqlite·wpf
Marzlam2 天前
一文读懂WPF系列之MVVM
wpf
Marzlam2 天前
一文读懂WPF系列之依赖属性与附加属性
wpf
zxb11c3 天前
WPF 中的元素继承层次结构 ,以下是对图中内容的详细说明:
wpf
Zhen (Evan) Wang3 天前
Margin和Padding在WPF和CSS中的不同
css·wpf
Marzlam3 天前
一文读懂WPF布局
wpf