美文网首页程序员
WPF之路-从XAML入手

WPF之路-从XAML入手

作者: 东南有大树 | 来源:发表于2018-09-14 15:10 被阅读10次

    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);
            }
        }
    }
    

    运行结果如下:

    相关文章

      网友评论

        本文标题:WPF之路-从XAML入手

        本文链接:https://www.haomeiwen.com/subject/qtpogftx.html