[UWP]创建自定义VisualState Trigger
这篇博客将介绍在UWP程序中如何创建和使用自定义VisualState Trigger。
上一篇博客中介绍了如何使用AdaptiveTrigger。目前UWP内置的StateTrigger只有AdaptiveTrigger一个,当MinWindowWidth/MinWindowHeight发生改变时,执行一些自适应布局。现在有这样一个场景,UWP程序在Mobile和Desktop上运行时显示不同的文字,这个时候就需要用到自定义StateTrigger了。
先分析一下系统自带的AdaptiveTrigger,
using Windows.Foundation;
using Windows.Foundation.Metadata; namespace Windows.UI.Xaml
{
//
// Summary:
// Represents a declarative rule that applies visual states based on window properties.
[Composable(typeof(IAdaptiveTriggerFactory), CompositionType.Public, , "Windows.Foundation.UniversalApiContract")]
[ContractVersion(typeof(UniversalApiContract), )]
[MarshalingBehavior(MarshalingType.Agile)]
[Static(typeof(IAdaptiveTriggerStatics), , "Windows.Foundation.UniversalApiContract")]
[Threading(ThreadingModel.Both)]
[WebHostHidden]
public class AdaptiveTrigger : StateTriggerBase, IAdaptiveTrigger
{
//
// Summary:
// Initializes a new instance of the AdaptiveTrigger class
public AdaptiveTrigger(); //
// Summary:
// Identifies the MinWindowHeight dependency property.
//
// Returns:
// The identifier for the MinWindowHeight dependency property.
public static DependencyProperty MinWindowHeightProperty { get; }
//
// Summary:
// Identifies the MinWindowWidth dependency property.
//
// Returns:
// The identifier for the MinWindowWidth dependency property.
public static DependencyProperty MinWindowWidthProperty { get; }
//
// Summary:
// Gets or sets the minimum window height at which the VisualState should be applied.
//
// Returns:
// The minimum window height (in effective pixels) at which the VisualState should
// be applied.
public System.Double MinWindowHeight { get; set; }
//
// Summary:
// Gets or sets the minimum window width at which the VisualState should be applied.
//
// Returns:
// The minimum window width (in effective pixels) at which the VisualState should
// be applied.
public System.Double MinWindowWidth { get; set; }
}
}
AdaptiveTrigger继承了StateTriggerBase,那么我们自定义的State Trigger继承StateTriggerBase即可。
enum DeviceType
{
Unknown = , Desktop = , Mobile = ,
} using Windows.Foundation.Collections;
using Windows.UI.Xaml; namespace CustomStateTrigger
{
class DeviceTypeAdaptiveTrigger : StateTriggerBase
{
public DeviceType PlatformType
{
get { return (DeviceType)GetValue(PlatformTypeProperty); }
set { SetValue(PlatformTypeProperty, value); }
} public static readonly DependencyProperty PlatformTypeProperty =
DependencyProperty.Register("PlatformType",
typeof(DeviceType),
typeof(DeviceTypeAdaptiveTrigger),
new PropertyMetadata(DeviceType.Unknown, OnDeviceTypePropertyChanged)); private static void OnDeviceTypePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
DeviceTypeAdaptiveTrigger dat = (DeviceTypeAdaptiveTrigger)d; DeviceType type = (DeviceType)e.NewValue; IObservableMap<string,string> qualifiers =
Windows.ApplicationModel.Resources.Core.ResourceContext.GetForCurrentView().QualifierValues; if(dat != null)
{
if(qualifiers.ContainsKey("DeviceFamily") &&
qualifiers["DeviceFamily"] == "Mobile")
{
dat.SetActive(type == DeviceType.Mobile);
} if (qualifiers.ContainsKey("DeviceFamily") &&
qualifiers["DeviceFamily"] == "Desktop")
{
dat.SetActive(type == DeviceType.Desktop);
}
}
}
}
}
这样我们自定义的一个StateTrigger就完成了。下面在XAML中应用这个自定义的StateTrigger。
<Page
x:Class="CustomStateTrigger.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:CustomStateTrigger"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:Triggers="using:CustomStateTrigger"
mc:Ignorable="d"> <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<TextBlock x:Name="DeviceTextBlock" VerticalAlignment="Center" HorizontalAlignment="Center" /> <VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="DeviceState">
<VisualState x:Name="DesktopState">
<VisualState.StateTriggers>
<Triggers:DeviceTypeAdaptiveTrigger PlatformType="Desktop" />
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Target="DeviceTextBlock.Text" Value="Desktop" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="MobileState">
<VisualState.StateTriggers>
<Triggers:DeviceTypeAdaptiveTrigger PlatformType="Mobile" />
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Target="DeviceTextBlock.Text" Value="Mobile" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
</Grid>
</Page>
运行结果:

在Github上有一个UWP的WindowsStateTriggers,里面都是一些自定义的StateTrigger,
https://github.com/dotMorten/WindowsStateTriggers
[UWP]创建自定义VisualState Trigger的更多相关文章
- 我的面板我做主 -- 淘宝UWP中自定义Panel的实现
在Windows10 UWP开发平台上内置的XMAL布局面板包括RelativePanel.StackPanel.Grid.VariableSizedWrapGrid 和 Canvas.在开发淘宝UW ...
- ArcGIS Engine环境下创建自定义的ArcToolbox Geoprocessing工具
在上一篇日志中介绍了自己通过几何的方法合并断开的线要素的ArcGIS插件式的应用程序.但是后来考虑到插件式的程序的配置和使用比较繁琐,也没有比较好的错误处理机制,于是我就把之前的程序封装成一个类似于A ...
- UWP 扩展/自定义标题栏的方法,一些概念和一些注意事项
原文 UWP 扩展/自定义标题栏的方法,一些概念和一些注意事项 在 Windows 10 的前几个版本中将页面内容扩展到标题栏上还算简单,主要是没什么坑.直到一些新控件的引入和一些外观设计趋势变化之后 ...
- Customize Acrylic Brush in UWP Applications(在UWP中自定义亚克力笔刷)
原文 Customize Acrylic Brush in UWP Applications(在UWP中自定义亚克力笔刷) Windows 10 Fall Creators Update(Build ...
- ASP.NET MVC随想录——创建自定义的Middleware中间件
经过前2篇文章的介绍,相信大家已经对OWIN和Katana有了基本的了解,那么这篇文章我将继续OWIN和Katana之旅——创建自定义的Middleware中间件. 何为Middleware中间件 M ...
- 带你走近AngularJS - 创建自定义指令
带你走近AngularJS系列: 带你走近AngularJS - 基本功能介绍 带你走近AngularJS - 体验指令实例 带你走近AngularJS - 创建自定义指令 ------------- ...
- [转]maven创建自定义的archetype
创建自己的archetype一般有两种方式,比较简单的就是create from project 1.首先使用eclipse创建一个新的maven project,然后把配置好的一些公用的东西放到相应 ...
- Dockerfile创建自定义Docker镜像以及CMD与ENTRYPOINT指令的比较
1.概述 创建Docker镜像的方式有三种 docker commit命令:由容器生成镜像: Dockerfile文件+docker build命令: 从本地文件系统导入:OpenVZ的模板. 关于这 ...
- .NET微信公众号开发-2.0创建自定义菜单
一.前言 开发之前,我们需要阅读官方的接口说明文档,不得不吐槽一下,微信的这个官方文档真的很烂,但是,为了开发我们需要的功能,我们也不得不去看这些文档. 接口文档地址:http://mp.weixin ...
随机推荐
- UML大战需求分析--阅读笔记01
本次阅读的书籍是<UML大战需求分析>,看了前两章的内容:1 大话UML,2绞尽脑汁的需求分析.这两章内容关联不大,分开描述. 第一章:大话UML 本章主要概述UML是什么,有什么内容.U ...
- REDHAT一总复习1更改系统文档文件
十台linux系统需要更改文档.请在server上执行以下任务: .在server计算机上,以student用户在/home/student目录中创建空文件,并将文件取名system_changes- ...
- MySQL的简单使用
MySQL 参数 参数 描述 备注 -D,--database=.name 打开指定数据库 mysql –uroot –procky –Dhisdb 或者mysql –uroot –prock ...
- 第一届山东省ACM——Balloons(java)
Description Both Saya and Kudo like balloons. One day, they heard that in the central park, there wi ...
- [Machine Learning] 梯度下降法的三种形式BGD、SGD以及MBGD
在应用机器学习算法时,我们通常采用梯度下降法来对采用的算法进行训练.其实,常用的梯度下降法还具体包含有三种不同的形式,它们也各自有着不同的优缺点. 下面我们以线性回归算法来对三种梯度下降法进行比较. ...
- 关于在vs2010中编译Qt项目时出现“无法解析的外部命令”的错误
用Cmake讲Qt.VTK和ITK整合后,打开解决方案后添加新类时运行会出现“n个无法解析的外部命令”的错误. 原因是新建的类未能生成moc文件,解决办法是: 1.右键 要生成moc文件的.h文件,打 ...
- 如何基于Azure平台实现MySQL HA(方法论篇)
我们都知道,相较于传统的数据中心,Pulic cloud也有劣势,比如说数据库的HA,很多熟悉公有云平台的读者都知道,因为出于安全性性考虑以及一些技术条件的限制,很多本地数据中心的mysql HA方法 ...
- java基础杂烩
1. int ... arg: 可变参数 2. 数组拷贝放在JDK中的System类中,arraycopy(原数组,从原数组那一个索引开始拷贝,目标数组,在目标数组哪一个位置开始粘贴,拷贝元素的个 ...
- C++基础知识(5)---类和对象
终于把C++中的基础在前面的几篇博客中总结完了,可能还有一些语法还没有总结到,没关系,以后用到了再查资料就好.类是C++中的一个非常重要的概念,这是区别你使用的C++到底是面向过程还是面向对象的一个重 ...
- 【Network】OVS VXLAN/GRE 实践
参考资料: OVS/VXLAN/GRE参考 ovs vxlan IP overray_百度搜索 OVS操作总结-Neutron-about云开发 OpenStack OVS GRE/VXLAN网络_z ...