WPF之路-从XAML入手

WPF新建好一个窗口后,会生成如下的XAML语句

<Window x:Class="WPF_Code.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>

同XML类似,XAML中最基本的语法元素就是标签、属性、内容

标签是通常是以<>开始,以</>结束的,一个标签的声明通常表示一个对象。如<Window></Window>、<Grid></Grid>分别定义了一个窗体对象及一个Grid对象,标签定义有两种常用写法:

  • 非自闭合签:<Window></Window>、<Grid></Grid>

  • 自闭合标签:< Window />、 <Grid/>这种自闭合标签用于无内容情况下,可以让代码看上去更简洁,当然,正常情况下Window及Grid都是有内容的

属性通常以键值对形式出现,如<Window><Window/>标签中的Title="MainWindow" Height="350" Width="525",等号左边表示Window标签的属性,等号右边表示该属性的值

一组标签对之间夹杂的文本或其他标签都称为这个标签之间的内容。此处Window标签的内容就是一个<Grid><Grid/>标签

x:Class="WpfExam.MainWindow":这里指定了我们XAML窗体界面对应的C#类,是WpfExam命名空间下的MainWindow这个分部类。

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation":表示引用wpf界面表现相关的命名空间,类似于我们C#类中的using

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml":表示引用xaml相关的命名空间。

这个xmlns:x中的x只是一个默认的标识符,如果我们将他改成y的话,编译我们的程序,将会报错找不到属性Class,此时我们就需要将x:Class="WpfExam.MainWindow"修改为y:Class="WpfExam.MainWindow"

同样,如果我们将xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"也增加一个标示符号的话,假如我们改成xmlns:a="http://schemas.microsoft.com/winfx/2006/xaml/presentation",那么将会提醒你找不到类型

Window、Grid,你需要标签<Window>、<Grid>替换为<a:Window>、<a:Grid>

示例,为Grid设置渐变色

<Window x:Class="WPF_Code.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.Background>
            <LinearGradientBrush>
                <GradientStop Color="#FFE27232" Offset="0"/>
                <GradientStop Color="White" Offset="1"/>
                <GradientStop Color="#FF6EBF61" Offset="2"/>
            </LinearGradientBrush>
        </Grid.Background>

    </Grid>
</Window>

元素的属性也可以通过标签来表示,如上所示的<Grid.Background>就是使用了Grid的背景属性,然后通过同样的方式,设置画笔的颜色,偏移量等待,完成渐变色

还可以通过打开属性面板》画笔来设置渐变色

既然说一个标签的声明就是一个类对象,那按照道理可以通过代码来创建类实现元素的创建

下面创建一个空的项目,然后添加两个类,分别命名为MyWindow.cs和Program.cs,前者用来创建一个包含按钮的窗体,后者用来启动这个窗体

MyWindow.cs

//需要引用以下三个命名空间
using System.Windows;
using System.Windows.Controls;
using System.Windows.Markup;

namespace WPF_Code
{
    //当前类要继承处Window类
    class MyWindow : Window
    {
        //一个未实例化的按钮对象
        private Button btn;

        //当前窗体的构造函数
        public  MyWindow()
        {
            InitializeComponent();
        }

        //用于初始化窗体
        private void InitializeComponent()
        {
            //设置窗体大小 
            this.Width = 280;
            this.Height =200;
            this.Left = this.Top = 100;
            this.Title = "MyWindow";

            //创建一个容器,用来接收Button
            DockPanel dock_panel = new DockPanel();

            //创建按钮对象
            btn = new Button();
            btn.Content = "Plese click me.";
            btn.Margin = new Thickness(30);

            //为按钮绑定事件
            btn.Click += btn_Click;

            //提供分析允许混合子元素或文本的元素所需的方法
            IAddChild container = dock_panel;
            container.AddChild(btn);
            container = this;
            container.AddChild(dock_panel);
        }

        void btn_Click(object sender, RoutedEventArgs e)
        {
            this.btn.Content = "Thanks!";
        }
    }
}

Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;//引用该命名空间

namespace WPF_Code
{
    //继承自Application
    class Program:Application
    {
        [STAThread()]//单线程单元不可少
        static void Main()//整个程序的入口
        {
            Program app_program = new Program();
            app_program.MainWindow = new MyWindow();//当前启动的窗体对象
            app_program.MainWindow.ShowDialog();//窗体以对话框形式启动
        }
    }
}

打开项目的属性,设置启动位置从Program启动

按下F5,显示结果

还可以动态的将XAML信息交给程序处理,动态生成相应的控件,将后端代码修改为

//需要引用以下三个命名空间
using System.Windows;
using System.Windows.Controls;
using System.Windows.Markup;

namespace WPF_Code
{
    //当前类要继承处Window类
    class MyWindow : Window
    {
        //一个未实例化的按钮对象
        private Button btn;

        //当前窗体的构造函数
        public  MyWindow()
        {
            InitializeComponent();
        }

        //用于初始化窗体
        private void InitializeComponent()
        {
            //创建XAML
            String xaml = " <StackPanel xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" Width=\"200\" Height=\"200\" Background=\"Blue\" > <Button Content=\"Dynamic Button One\" Background=\"Yellow\"/> <Button Content=\"Dynamic Button Two\" Background=\"Yellow\"/> <Button Content=\"Dynamic Button Three\" Background=\"Yellow\"/> <TextBox Text=\"Dynamic TextBox\" Background=\"LightGreen\"/> </StackPanel>";
            
            //指定XAML
            this.Content = XamlReader.Parse(xaml);
        }
    }
}

运行结果如下:

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,755评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,369评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,799评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,910评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,096评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,159评论 3 411
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,917评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,360评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,673评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,814评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,509评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,156评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,123评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,641评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,728评论 2 351

推荐阅读更多精彩内容