zoukankan      html  css  js  c++  java
  • XAML: x:DeferLoadStrategy, x:Null

    x:DeferLoadStrategy="Lazy" - 用于指定一个 UIElement 为一个延迟加载元素

    • x:Null - null



    示例
    1、x:DeferLoadStrategy 通过 FindName 加载
    Xaml/DeferLoadStrategy/Demo1.xaml

    复制代码
    <Page
        x:Class="Windows10.Xaml.DeferLoadStrategy.Demo1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:Windows10.Xaml.DeferLoadStrategy"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d">
    
        <Grid Background="Transparent">
            <StackPanel Margin="10 0 10 10">
    
                <TextBlock Name="lblMsg" TextWrapping="Wrap" Margin="5" />
                
                <!--
                    x:DeferLoadStrategy="Lazy" - 其仅作用于 UIElement,可以指定一个 UIElement 为一个延迟加载元素
                    1、标记为延迟加载的元素必须要指定其 x:Name
                    2、UIElement 不是在任何情况下都能标记为 x:DeferLoadStrategy="Lazy" 的,不是只有 FindName 才能加载延迟加载元素,具体参见文档:https://msdn.microsoft.com/en-us/windows/uwp/xaml-platform/x-deferloadstrategy-attribute
                    3、将 UIElement 标记为 x:DeferLoadStrategy="Lazy" 的好处是可以减少页面的启动时间,带来的问题是会增加内存的使用量,每个延迟加载元素大约多耗费 600 字节左右的内存
                    4、延迟加载元素在加载后,会触发其 Loading 事件
                -->
                <TextBlock Name="textBlock" Margin="5" x:DeferLoadStrategy="Lazy" />
    
            </StackPanel>
        </Grid>
    </Page>
    复制代码

    Xaml/DeferLoadStrategy/Demo1.xaml.cs

    复制代码
    /*
     * 演示 x:DeferLoadStrategy 的相关知识点
     *
     * 本例演示通过“FindName”加载延迟加载元素
     */
    
    using System;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    
    namespace Windows10.Xaml.DeferLoadStrategy
    {
        public sealed partial class Demo1 : Page
        {
            public Demo1()
            {
                this.InitializeComponent();
    
                this.Loaded += DeferLoadStrategyDemo_Loaded;
            }
    
            private void DeferLoadStrategyDemo_Loaded(object sender, RoutedEventArgs e)
            {
                try
                {
                    // 抛出异常
                    textBlock.Text = "我是 TextBlock";
                }
                catch (Exception ex)
                {
                    lblMsg.Text += ex.ToString();
                    lblMsg.Text += Environment.NewLine;
                }
    
                // 可以通过 FindName() 来加载 x:DeferLoadStrategy="Lazy" 元素
                this.FindName(nameof(textBlock));
    
                textBlock.Text = "我是 TextBlock";
            }
        }
    }
    复制代码


    2、x:DeferLoadStrategy 通过绑定加载
    Xaml/DeferLoadStrategy/Demo2.xaml

    复制代码
    <Page
        x:Class="Windows10.Xaml.DeferLoadStrategy.Demo2"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:Windows10.Xaml.DeferLoadStrategy"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d">
    
        <Grid Background="Transparent">
            <StackPanel Margin="10 0 10 10">
    
                <TextBox Name="textBox1" Margin="5" />
                
                <!--延迟加载元素-->
                <TextBox Name="textBox2" x:DeferLoadStrategy="Lazy" Text="我是 TextBox" Margin="5" />
    
                <!--将 textBox2 与 textBox1 绑定后,textBox2 就会被加载-->
                <Button Name="button" Content="将 textBox1 的 Text 绑定到 textBox2 的 Text" Click="button_Click" Margin="5" />
                
            </StackPanel>
        </Grid>
    </Page>
    复制代码

    Xaml/DeferLoadStrategy/Demo2.xaml.cs

    复制代码
    /*
     * 演示 x:DeferLoadStrategy 的相关知识点
     *
     * 本例演示通过“绑定”加载延迟加载元素
     */
    
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    using Windows.UI.Xaml.Data;
    
    namespace Windows10.Xaml.DeferLoadStrategy
    {
        public sealed partial class Demo2 : Page
        {
            public Demo2()
            {
                this.InitializeComponent();
            }
    
            private void button_Click(object sender, RoutedEventArgs e)
            {
                // 实例化 Binding 对象
                Binding binding = new Binding()
                {
                    ElementName = nameof(textBox2), // textBox2 是延迟加载元素,将其与 textBox1 绑定后,textBox2 就会被加载
                    Path = new PropertyPath(nameof(TextBox.Text)),
                    Mode = BindingMode.TwoWay,
                    UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged
                };
    
                // 将目标对象的目标属性与指定的 Binding 对象关联
                BindingOperations.SetBinding(textBox1, TextBox.TextProperty, binding);
            }
        }
    }
    复制代码


    3、x:DeferLoadStrategy 通过 Storyboard 加载
    Xaml/DeferLoadStrategy/Demo3.xaml

    复制代码
    <Page
        x:Class="Windows10.Xaml.DeferLoadStrategy.Demo3"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:Windows10.Xaml.DeferLoadStrategy"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d">
    
        <Page.Resources>
            <Storyboard x:Name="sb">
                <ColorAnimation Storyboard.TargetName="ellipse" 
                                Storyboard.TargetProperty="(Ellipse.Fill).(SolidColorBrush.Color)" 
                                BeginTime="00:00:00" 
                                From="Orange" 
                                To="Blue" 
                                Duration="0:0:3" 
                                AutoReverse="true" 
                                RepeatBehavior="Forever ">
                </ColorAnimation>
            </Storyboard>
        </Page.Resources>
        
        <Grid Background="Transparent">
            <StackPanel Margin="10 0 10 10">
    
                <!--延迟加载元素-->
                <Ellipse x:Name="ellipse" Fill="Orange" Width="200" Height="100" x:DeferLoadStrategy="Lazy" HorizontalAlignment="Left" Margin="5" />
    
                <!--启动一个引用了延迟加载元素的动画后,该延迟加载元素就会被加载-->
                <Button Name="button" Content="开始动画" Click="button_Click" Margin="5" />
    
            </StackPanel>
        </Grid>
    </Page>
    复制代码

    Xaml/DeferLoadStrategy/Demo3.xaml.cs

    复制代码
    /*
     * 演示 x:DeferLoadStrategy 的相关知识点
     *
     * 本例演示通过“Storyboard”加载延迟加载元素
     */
    
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    
    namespace Windows10.Xaml.DeferLoadStrategy
    {
        public sealed partial class Demo3 : Page
        {
            public Demo3()
            {
                this.InitializeComponent();
            }
    
            private void button_Click(object sender, RoutedEventArgs e)
            {
                // 启动一个引用了延迟加载元素的动画后,该延迟加载元素就会被加载
                sb.Begin();
            }
        }
    }
    复制代码


    4、x:DeferLoadStrategy 通过 Setter 加载
    Xaml/DeferLoadStrategy/Demo4.xaml

    复制代码
    <Page
        x:Class="Windows10.Xaml.DeferLoadStrategy.Demo4"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:Windows10.Xaml.DeferLoadStrategy"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d">
    
        <Grid Background="Transparent">
    
            <VisualStateManager.VisualStateGroups>
                <VisualStateGroup x:Name="WindowSizeStates">
                    <VisualState>
                        <VisualState.StateTriggers>
                            <AdaptiveTrigger MinWindowWidth="360" />
                        </VisualState.StateTriggers>
                    </VisualState>
                    <VisualState>
                        <VisualState.StateTriggers>
                            <AdaptiveTrigger MinWindowWidth="0" />
                        </VisualState.StateTriggers>
                        <VisualState.Setters>
                            <!--窗口宽度小于 360 时调用,此处 setter 引用了延迟加载元素,该延迟加载元素将会被加载-->
                            <Setter Target="textBox.Foreground" Value="Red" />
                        </VisualState.Setters>
                    </VisualState>
                </VisualStateGroup>
    
            </VisualStateManager.VisualStateGroups>
    
            <StackPanel Margin="10 0 10 10">
    
                <!--延迟加载元素-->
                <TextBox Name="textBox" Text="我是 TextBox" x:DeferLoadStrategy="Lazy" />
    
            </StackPanel>
        </Grid>
    </Page>
    复制代码

    Xaml/DeferLoadStrategy/Demo4.xaml.cs

    复制代码
    /*
     * 演示 x:DeferLoadStrategy 的相关知识点
     *
     * 本例演示通过“Setter”加载延迟加载元素
     */
    
    using Windows.UI.Xaml.Controls;
    
    namespace Windows10.Xaml.DeferLoadStrategy
    {
        public sealed partial class Demo4 : Page
        {
            public Demo4()
            {
                this.InitializeComponent();
            }
        }
    }
    复制代码


    5、x:DeferLoadStrategy 通过 GetTemplateChild 加载
    Xaml/DeferLoadStrategy/Demo5.xaml

    复制代码
    <Page
        x:Class="Windows10.Xaml.DeferLoadStrategy.Demo5"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:Windows10.Xaml.DeferLoadStrategy"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d">
    
        <Page.Resources>
            <Style TargetType="local:TitledImage">
                <Setter Property="HorizontalAlignment" Value="Left" />
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="local:TitledImage">
                            <Grid>
                                <Image Source="{TemplateBinding Source}" Width="200" Height="100" Stretch="Uniform" HorizontalAlignment="Center" VerticalAlignment="Center" />
                                <!--延迟加载元素,当调用 GetTemplateChild 后,它将被加载-->
                                <ContentPresenter x:Name="TitlePresenter" x:DeferLoadStrategy="Lazy" Content="{TemplateBinding Title}" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Foreground="White" />
                            </Grid>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </Page.Resources>
        
        <Grid Background="Transparent">
            <StackPanel Margin="10 0 10 10">
    
                <!--对应的 ControlTemplate 中的延迟加载元素 TitlePresenter 不会被加载-->
                <local:TitledImage Source="/Assets/SplashScreen.png" />
    
                <!--对应的 ControlTemplate 中的延迟加载元素 TitlePresenter 会被加载(因为调用了 GetTemplateChild)-->
                <local:TitledImage Source="/Assets/SplashScreen.png" Title="image title" />
                
            </StackPanel>
        </Grid>
    </Page>
    复制代码

    Xaml/DeferLoadStrategy/Demo5.xaml.cs

    复制代码
    /*
     * 演示 x:DeferLoadStrategy 的相关知识点
     *
     * 本例演示通过“GetTemplateChild”加载延迟加载元素
     */
    
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    using Windows.UI.Xaml.Media;
    using Windows.UI.Xaml.Media.Imaging;
    
    namespace Windows10.Xaml.DeferLoadStrategy
    {
        public sealed partial class Demo5 : Page
        {
            public Demo5()
            {
                this.InitializeComponent();
            }
        }
    
    
    
        // 自定义控件(一个可显示 Title 的 Image)
        public class TitledImage : Control
        {
            // 此自定义控件用于显示 Title 的 ContentPresenter
            private ContentPresenter _titlePresenter;
    
            public TitledImage()
            {
                this.DefaultStyleKey = typeof(TitledImage);
    
                // 注册一个回调,当 Title 发生变化时触发
                this.RegisterPropertyChangedCallback(TitleProperty, TitleChanged);
            }
    
            // 定义一个依赖属性 Title(用于显示标题)
            public static readonly DependencyProperty TitleProperty = DependencyProperty.Register(nameof(Title), typeof(string), typeof(TitledImage), new PropertyMetadata(null));
            public string Title
            {
                get { return (string)GetValue(TitleProperty); }
                set { SetValue(TitleProperty, value); }
            }
    
            // 定义一个依赖属性 Source(用于显示图片)
            public static readonly DependencyProperty SourceProperty = DependencyProperty.Register(nameof(Source), typeof(ImageSource), typeof(TitledImage), new PropertyMetadata(null));
            public ImageSource Source
            {
                get { return (BitmapSource)GetValue(SourceProperty); }
                set { SetValue(SourceProperty, value); }
            }
    
            void TitleChanged(DependencyObject sender, DependencyProperty prop)
            {
                string title = (string)sender.GetValue(prop);
                
                if (!string.IsNullOrEmpty(Title) && _titlePresenter == null)
                {
                    // TitlePresenter 是控件模板中的一个延迟加载元素,通过 GetTemplateChild 调用后,它将被加载
                    _titlePresenter = (ContentPresenter)GetTemplateChild("TitlePresenter"); 
                }
            }
    
            protected override void OnApplyTemplate()
            {
                base.OnApplyTemplate();
    
                if (!string.IsNullOrEmpty(Title))
                {
                    // TitlePresenter 是控件模板中的一个延迟加载元素,通过 GetTemplateChild 调用后,它将被加载
                    _titlePresenter = (ContentPresenter)GetTemplateChild("TitlePresenter");
                }
            }
        }
    }
    复制代码


    6、x:Null - null
    Xaml/NullDemo.xaml

    复制代码
    <Page
        x:Class="Windows10.Xaml.NullDemo"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:Windows10.Xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d">
    
        <Grid Background="Transparent">
            <StackPanel Margin="10 0 10 10">
    
                <TextBlock Name="lblMsg" TextWrapping="Wrap" Margin="5" />
    
                <!--不指定 Tag 则其默认值为 null-->
                <TextBlock Name="textBlock1" Margin="5" />
    
                <!--指定 Tag 的值为 ""-->
                <TextBlock Name="textBlock2" Margin="5" Tag="" />
    
                <!--指定 Tag 的值为 null-->
                <TextBlock Name="textBlock3" Margin="5" Tag="{x:Null}" />
    
            </StackPanel>
        </Grid>
    </Page>
    复制代码

    Xaml/NullDemo.xaml.cs

    复制代码
    /*
     * 演示 x:Null 的相关知识点、
     *
     * 在这里插一句:
     * 在 xaml 使用的 {x:Null}, {Binding}, {x:Bind}, {StaticResource} 之类的这种带大括号的语法被称为标记扩展(Markup Extension),在 uwp 中无法开发自定义标记扩展(但是在 wpf 中是可以的)
     */
    
    using System;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    
    namespace Windows10.Xaml
    {
        public sealed partial class NullDemo : Page
        {
            public NullDemo()
            {
                this.InitializeComponent();
    
                this.Loaded += NullDemo_Loaded;
            }
    
            private void NullDemo_Loaded(object sender, RoutedEventArgs e)
            {
                lblMsg.Text = $"textBlock1.Tag: {textBlock1.Tag ?? "null"}"; // null
                lblMsg.Text += Environment.NewLine;
    
                lblMsg.Text += $"textBlock2.Tag: {textBlock2.Tag ?? "null"}"; // ""
                lblMsg.Text += Environment.NewLine;
    
                lblMsg.Text += $"textBlock3.Tag: {textBlock3.Tag ?? "null"}"; // null
            }
        }
    }
  • 相关阅读:
    关于Vim的问题s
    突然想来说几句
    直接下载Google Play市场的APK
    编译 ijg JPEG V8 库 GIF 库
    linux下 GUI 数码相册项目 持续更新中
    nes 红白机模拟器 第8篇 USB 手柄支持
    nes 红白机模拟器 第7篇 编译使用方法
    nes 红白机模拟器 第6篇 声音支持
    使用 ALSAlib 播放 wav
    ALSA 声卡 驱动 linux 4.1.36 中变化
  • 原文地址:https://www.cnblogs.com/ansen312/p/5913399.html
Copyright © 2011-2022 走看看