• 《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;
            }
        }
    }
  • 相关阅读:
    谷歌浏览器network请求时间(stalled,DNS Lookup,Waiting)分析以及解决方案
    Maven项目下启动后Eclipse报错:org.springframework.web.context.ContextLoaderListener
    探讨ES6的import export default 和CommonJS的require module.exports
    Node.js+websocket+mongodb实现即时聊天室
    slider轮播插件的多种写法
    原生canvas写的飞机游戏
    vue父组件如何向子组件中传递数据?
    vue计算属性VS侦听属性
    vue等单页面应用优缺点
    vue自定义过滤器的创建与使用
  • 原文地址:https://www.cnblogs.com/khjian/p/5954030.html
Copyright © 2020-2023  润新知