这篇博客将介绍在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的更多相关文章

  1. 我的面板我做主 -- 淘宝UWP中自定义Panel的实现

    在Windows10 UWP开发平台上内置的XMAL布局面板包括RelativePanel.StackPanel.Grid.VariableSizedWrapGrid 和 Canvas.在开发淘宝UW ...

  2. ArcGIS Engine环境下创建自定义的ArcToolbox Geoprocessing工具

    在上一篇日志中介绍了自己通过几何的方法合并断开的线要素的ArcGIS插件式的应用程序.但是后来考虑到插件式的程序的配置和使用比较繁琐,也没有比较好的错误处理机制,于是我就把之前的程序封装成一个类似于A ...

  3. UWP 扩展/自定义标题栏的方法,一些概念和一些注意事项

    原文 UWP 扩展/自定义标题栏的方法,一些概念和一些注意事项 在 Windows 10 的前几个版本中将页面内容扩展到标题栏上还算简单,主要是没什么坑.直到一些新控件的引入和一些外观设计趋势变化之后 ...

  4. Customize Acrylic Brush in UWP Applications(在UWP中自定义亚克力笔刷)

    原文 Customize Acrylic Brush in UWP Applications(在UWP中自定义亚克力笔刷) Windows 10 Fall Creators Update(Build ...

  5. ASP.NET MVC随想录——创建自定义的Middleware中间件

    经过前2篇文章的介绍,相信大家已经对OWIN和Katana有了基本的了解,那么这篇文章我将继续OWIN和Katana之旅——创建自定义的Middleware中间件. 何为Middleware中间件 M ...

  6. 带你走近AngularJS - 创建自定义指令

    带你走近AngularJS系列: 带你走近AngularJS - 基本功能介绍 带你走近AngularJS - 体验指令实例 带你走近AngularJS - 创建自定义指令 ------------- ...

  7. [转]maven创建自定义的archetype

    创建自己的archetype一般有两种方式,比较简单的就是create from project 1.首先使用eclipse创建一个新的maven project,然后把配置好的一些公用的东西放到相应 ...

  8. Dockerfile创建自定义Docker镜像以及CMD与ENTRYPOINT指令的比较

    1.概述 创建Docker镜像的方式有三种 docker commit命令:由容器生成镜像: Dockerfile文件+docker build命令: 从本地文件系统导入:OpenVZ的模板. 关于这 ...

  9. .NET微信公众号开发-2.0创建自定义菜单

    一.前言 开发之前,我们需要阅读官方的接口说明文档,不得不吐槽一下,微信的这个官方文档真的很烂,但是,为了开发我们需要的功能,我们也不得不去看这些文档. 接口文档地址:http://mp.weixin ...

随机推荐

  1. UML大战需求分析--阅读笔记01

    本次阅读的书籍是<UML大战需求分析>,看了前两章的内容:1 大话UML,2绞尽脑汁的需求分析.这两章内容关联不大,分开描述. 第一章:大话UML 本章主要概述UML是什么,有什么内容.U ...

  2. REDHAT一总复习1更改系统文档文件

    十台linux系统需要更改文档.请在server上执行以下任务: .在server计算机上,以student用户在/home/student目录中创建空文件,并将文件取名system_changes- ...

  3. MySQL的简单使用

    MySQL 参数     参数 描述 备注 -D,--database=.name 打开指定数据库 mysql –uroot –procky –Dhisdb 或者mysql –uroot –prock ...

  4. 第一届山东省ACM——Balloons(java)

    Description Both Saya and Kudo like balloons. One day, they heard that in the central park, there wi ...

  5. [Machine Learning] 梯度下降法的三种形式BGD、SGD以及MBGD

    在应用机器学习算法时,我们通常采用梯度下降法来对采用的算法进行训练.其实,常用的梯度下降法还具体包含有三种不同的形式,它们也各自有着不同的优缺点. 下面我们以线性回归算法来对三种梯度下降法进行比较. ...

  6. 关于在vs2010中编译Qt项目时出现“无法解析的外部命令”的错误

    用Cmake讲Qt.VTK和ITK整合后,打开解决方案后添加新类时运行会出现“n个无法解析的外部命令”的错误. 原因是新建的类未能生成moc文件,解决办法是: 1.右键 要生成moc文件的.h文件,打 ...

  7. 如何基于Azure平台实现MySQL HA(方法论篇)

    我们都知道,相较于传统的数据中心,Pulic cloud也有劣势,比如说数据库的HA,很多熟悉公有云平台的读者都知道,因为出于安全性性考虑以及一些技术条件的限制,很多本地数据中心的mysql HA方法 ...

  8. java基础杂烩

    1. int ... arg: 可变参数   2. 数组拷贝放在JDK中的System类中,arraycopy(原数组,从原数组那一个索引开始拷贝,目标数组,在目标数组哪一个位置开始粘贴,拷贝元素的个 ...

  9. C++基础知识(5)---类和对象

    终于把C++中的基础在前面的几篇博客中总结完了,可能还有一些语法还没有总结到,没关系,以后用到了再查资料就好.类是C++中的一个非常重要的概念,这是区别你使用的C++到底是面向过程还是面向对象的一个重 ...

  10. 【Network】OVS VXLAN/GRE 实践

    参考资料: OVS/VXLAN/GRE参考 ovs vxlan IP overray_百度搜索 OVS操作总结-Neutron-about云开发 OpenStack OVS GRE/VXLAN网络_z ...