背水一战 Windows 10 (26) - XAML: x:DeferLoadStrategy, x:Null
2021-05-12 19:30
标签:temp object setters pat bind init c++ art png
原文:背水一战 Windows 10 (26) - XAML: x:DeferLoadStrategy, x:Null[源码下载]
作者:webabcd
介绍
背水一战 Windows 10 之 XAML
- 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" />
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" />
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>
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" />
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">
local:TitledImage Source="/Assets/SplashScreen.png" />
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" />
TextBlock Name="textBlock1" Margin="5" />
TextBlock Name="textBlock2" Margin="5" Tag="" />
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 } } }
OK
[源码下载]
背水一战 Windows 10 (26) - XAML: x:DeferLoadStrategy, x:Null
标签:temp object setters pat bind init c++ art png
原文地址:http://www.cnblogs.com/lonelyxmas/p/7567211.html
上一篇:C#之玩转反射
下一篇:Spring DI注入技术
文章标题:背水一战 Windows 10 (26) - XAML: x:DeferLoadStrategy, x:Null
文章链接:http://soscw.com/index.php/essay/84830.html