《C#高级编程》读书笔记(二十):核心XAML

1,关于XAML

编写 WPF 应用程序、使用 WF、创建 XPS 文档 、编写 Silverlight 或者 Windows 8 应用程序,就还需要 XAML。XAML(eXtensible Application Markup Lauguage,可扩展应用程序标记语言)是一种声明性的 XML 语法。

XAML 代码使用文本XML来声明。XAML 代码可以使用设计器创建,也可以手动编写。

2,将元素映射到.NET对象上

创建C#控制台项目,引用程序集 PresentationFramework、PresentationCore、WindowBase 和 System.Xaml。

using System;
using System.Windows;
using System.Windows.Controls;

namespace ConsoleXAML
{
    class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            var b = new Button()
            {
                Content = "Click Me!"
            };
            var w = new Window()
            {
                Title = "Code Demo",
                Content = b
            };

            var app = new Application();
            app.Run(w);
        }
    }
}

3,使用自定义.NET 类

namespace XAMLIntro
{
    public class Person
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }

        public override string ToString()
        {
            return $"{FirstName} {LastName}";
        }
    }
}
<Window x:Class="XAMLIntro.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:XAMLIntro"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Button Content="Click Me!" Height="20" Width="100"
                Background="LightGoldenrodYellow" Click="Button_Click"></Button>
        <ListBox Margin="193,35,194,204">
            <local:Person FirstName="Stephanie" LastName="Nagel"></local:Person>
            <local:Person FirstName="Matthias" LastName="Nagel"></local:Person>
        </ListBox>
        <Button Margin="208,198,201,93" HorizontalAlignment="Center" VerticalAlignment="Center">
            Click Test!
        </Button>
    </Grid>
    <!--<x:Array Type="local:Person">
        <local:Person FirstName="Stephanie" LastName="Nagel"></local:Person>
        <local:Person FirstName="Matthias" LastName="Nagel"></local:Person>
    </x:Array>-->
</Window>

4,事件的冒泡和隧道

元素可以包含在其他元素中。内层元素的事件可以传递到外部,这就冒泡事件。外部向内部移动,叫隧道事件。WPF 支持事件的冒泡和隧道。

<Window x:Class="ButtleDemo.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:ButtleDemo"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
   <StackPanel x:Name="StackPanel1" Button.Click="OnOuterButtonClick">
       <Button x:Name="Button1" Content="Button 1" Margin="5,15,5,5"></Button>
        <Button x:Name="Button2"  Margin="5" Click="OnButton2">
            <ListBox x:Name="ListBox1">
                <Button x:Name="InnerButton1" Content="Inner Button 1" Margin="4" Padding="4" Click="OnInner1"></Button>
                <Button x:Name="InnerButton2" Content="Inner Button 2" Margin="4" Padding="4" Click="OnInner2"></Button>
            </ListBox>
        </Button>
       <ListBox ItemsSource="{Binding}"></ListBox>
    </StackPanel>
</Window>
using System.Collections.ObjectModel;
using System.Windows;

namespace ButtleDemo
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        private ObservableCollection<string> messages = new ObservableCollection<string>();
        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = messages;
        }

        private void AddMessage(string message, object sender, RoutedEventArgs e)
        {
            messages.Add(
                $"{message}," +
                $"sender:{(sender as FrameworkElement).Name};" +
                $"source:{(e.Source as FrameworkElement).Name};" +
                $"original source:{(e.OriginalSource as FrameworkElement).Name}");
        }

        private void OnOuterButtonClick(object sender, RoutedEventArgs e)
        {
            AddMessage("最外层单击", sender, e);
        }

        private void OnButton2(object sender, RoutedEventArgs e)
        {
            AddMessage("Button2单击",sender,e);
            e.Source = sender;
        }

        private void OnInner1(object sender, RoutedEventArgs e)
        {
            AddMessage("Inner 1 Click!",sender,e);
        }

        private void OnInner2(object sender, RoutedEventArgs e)
        {
            AddMessage("Inner 2 Click!", sender, e);
            e.Handled = true;
        }
    }
}
时间: 2024-10-09 17:24:07

《C#高级编程》读书笔记(二十):核心XAML的相关文章

《Programming in Lua 3》读书笔记(二十二)

日期:2014.8.6 PartⅣ The C API 26 Extending Your Application 使用Lua很重要的一点是用来做配置语言.配合主语言做一些功能的配置. 26.1 The Basics 有的时候程序需要配置一些功能信息,很多时候可能有许多别的方法比用lua做配置要更简单:如使用环境变量或者读取文件,读取文件涉及到文件的解析.如果使用Lua进行配置的话,相当于用lua文件替代了要读取的如csv.txt文件等. 使用Lua进行配置的时候,就需要使用Lua API去控制

《Programming in Lua 3》读书笔记(二十五)

日期:2014.8.11 PartⅣ The C API 29 User-Defined Types in C 在之前的例子里,已经介绍过如果通过用C写函数来扩展Lua.在本章,将会介绍通过用C写新的类型来扩展Lua,将会使用到元方法等特性来实现这个功能. 以一个例子来介绍本章将要介绍的,例子实现的功能是实现了一个简单的类型:boolean arrays.实现这个功能主要是这种方法不需要太复杂的算法,因此可以将精力放在API的讨论上.当然我们可以在Lua中用一个table来实现,但是用一个C来实

《Programming in Lua 3》读书笔记(二十六)

日期:2014.8.12 PartⅣ The C API 30 Managing Resources 上一节中实现的自定义类型,我们并没有关注于资源管理的问题.上一节实现的数组是需要关心内存问题,而这些问题由Lua实现管理.但是很多时候事情不那么简单,有些对象不仅需要内存空间,还会需要如窗口句柄.文件描述等资源.尽管说这些也是内存开销,但是这些资源是由系统的其他组件管理的.这种情况下,当一个对象被回收了,我们也需要合适的机制来实现回收这些额外的资源. 在17.6章节中,介绍了Lua提供的fina

《Programming in Lua 3》读书笔记(二十八)

日期:2014.8.15 PartⅣ The C API 32 Memory Management Lua是动态的对其数据结构进行管理的.所有数据结构按需求进行增长,最终进行释放.Lua对其内存的使用控制较为严格,当我们关闭了一个Lua state的时候,Lua会立即释放其内存占用.不仅如此,Lua中的所有对象都被垃圾回收器管理,包括tables,strings,和functions,threads,和modules. Lua进行内存管理的方式对多数程序来说都是挺合适的.但是还是有一些特殊的程序

C++Windows核心编程读书笔记

转自:http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E6%96%87/71405.shtml "C++Windows核心编程读书笔记": 关键词:c++windows 核心 编程 读书笔记 这篇笔记是我在读<windows核心编程>第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的思考和对实现的推断,因此不少条款和windows实际机制可能有出入,但应该是合理的.开头几章由于我追求简洁

《JavaScript 高级程序设计》读书笔记二 使用JavaScript

一   <script>元素 a.四个属性: async:立即异步加载外部脚本: defer:延迟到文档完全被解析再加载外部脚本: src:外部脚本路径: type:脚本语言的内容类型: 二   XHTML中用法 a. //<![CDATA[ javascript代码 //]]> 三   <noscript>元素 <JavaScript 高级程序设计>读书笔记二 使用JavaScript

Effective C++读书笔记之十二:复制对象时勿忘其每一个成分

Item 12:Copy all parts of an object 如果你声明自己的copying函数,意思就是告诉编译器你并不喜欢缺省显示中的某些行为.而编译器会对"你自己写出copying函数"做出一种复仇的行为:既然你拒绝它们为你写出copying函数,如果你的代码不完全,它们也不会告诉你.结论很明显:如果你为class添加一个成员变量,你必须同时修改copying函数.如果你忘记,编译器不太可能提醒你. 一下提供一种正确的模版: class Date{...}; class

《R实战》读书笔记二

第一章 R简介 本章概要 1安装R 2理解R语言 3运行R程序 本章所介绍的内容概括如下. 一个典型的数据分析步骤如图1所示. 图1:典型数据分析步骤 简而言之,现今的数据分析要求我们从多种数据源中获取数据.数据合并.标注.清洗和分析,并且把分析的结果进行展示,形成报告或者系统,辅助决策.R能够满足现今数据分析的要求. 为什么用R? R是一个适合统计分析和绘图的环境与语言.它是开源.免费的,获得世界范围社区支持.统计分析和绘图工具已经很多了,例如:SPSS,SAS,Excel,Stata和Min

《android开发艺术探索》读书笔记(十五)--Android性能优化

接上篇<android开发艺术探索>读书笔记(十四)--JNI和NDK编程 No1: 如果<include>制定了这个id属性,同时被包含的布局文件的根元素也制定了id属性,那么以<include>指定的id属性为准 No2: 绘制优化 1)onDraw中不要创建新的局部对象 2)onDraw方法中不要做耗时的任务 No3: 内存泄露优化 场景一:静态变量导致的内存泄露: 如果静态变量持有了一个Activity,会导致Activity无法及时释放. 解决办法:1使用Ap

Android学习笔记二十九之SwipeRefreshLayout、RecyclerView和CardView

Android学习笔记二十九之SwipeRefreshLayout.RecyclerView和CardView 前面我们介绍了AlertDialog和几个常用的Dialog,ProgressDialog进度条提示框.DatePickerDialog日期选择对话框和TimePickerDialog时间选择对话框.这一节我们介绍几个新的API控件SwipeRefreshLayout.RecyclerView和CardView,这几个API控件都是google在Android5.0推出的.下面我们来学