设为首页 收藏本站
查看: 458|回复: 0

[经验分享] 背水一战 Windows 10 (26)

[复制链接]

尚未签到

发表于 2017-6-28 14:36:57 | 显示全部楼层 |阅读模式
  [源码下载]




背水一战 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" />
<!--
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
        }
}
}
  
OK
[源码下载]

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-389042-1-1.html 上篇帖子: windows service宿主web api使用"依赖注入"和“控制反转”的技术实践 下篇帖子: windows server2016 安装docker
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表