【WIN10】VisualStateManager使用說明

Demo下載:http://yunpan.cn/cFjgPtWRHKH9H  访问密码 c4b7

 

顧名思義,視圖狀態管理器。

在WPF中,它的功能似乎更強大。在UWP中,閹割了GotElementState方法,導致它只能在控件內部使用。

 

這個東東一般用來突出某些操作,以提醒用戶。它原來是狀態A,後來用戶進行了某些操作,我們就會根據用戶的操作,判斷他想要做什麼,然後根據他的目的,顯示狀態B。最容易理解的例子就是按鈕,它普通狀態,鼠標放上去以後,變成了另一種狀態,點擊又是另一種狀態。

 

1.按鈕狀態

我們先來看看,按鈕有哪些狀態。首先我們來編輯一個按鈕模板:XAML面板中,添加一個按鈕,並在它上面右鍵->編輯模板->編輯副本,截圖如下:

然後,我們就可以得到一個按鈕的副本:

<Style x:Key="ButtonStyle1" TargetType="Button"><Setter Property="Background" Value="{ThemeResource SystemControlBackgroundBaseLowBrush}"/><Setter Property="Foreground" Value="{ThemeResource SystemControlForegroundBaseHighBrush}"/><Setter Property="BorderBrush" Value="{ThemeResource SystemControlForegroundTransparentBrush}"/><Setter Property="BorderThickness" Value="{ThemeResource ButtonBorderThemeThickness}"/><Setter Property="Padding" Value="8,4,8,4"/><Setter Property="HorizontalAlignment" Value="Left"/><Setter Property="VerticalAlignment" Value="Center"/><Setter Property="FontFamily" Value="{ThemeResource ContentControlThemeFontFamily}"/><Setter Property="FontWeight" Value="Normal"/><Setter Property="FontSize" Value="{ThemeResource ControlContentThemeFontSize}"/><Setter Property="UseSystemFocusVisuals" Value="True"/><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="Button"><Grid x:Name="RootGrid"><Grid.Background><SolidColorBrush x:Name="bkBrush" Color="LightGray" /></Grid.Background><VisualStateManager.VisualStateGroups><VisualStateGroup x:Name="CommonStates"><VisualState x:Name="Normal"><Storyboard><PointerUpThemeAnimation Storyboard.TargetName="RootGrid"/></Storyboard></VisualState><VisualState x:Name="PointerOver"><Storyboard><ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="BorderBrush" Storyboard.TargetName="ContentPresenter"><DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlHighlightBaseMediumLowBrush}"/></ObjectAnimationUsingKeyFrames><ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Foreground" Storyboard.TargetName="ContentPresenter"><DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlHighlightBaseHighBrush}"/></ObjectAnimationUsingKeyFrames><PointerUpThemeAnimation Storyboard.TargetName="RootGrid"/></Storyboard></VisualState><VisualState x:Name="Pressed"><Storyboard><ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Background" Storyboard.TargetName="RootGrid"><DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlBackgroundBaseMediumLowBrush}"/></ObjectAnimationUsingKeyFrames><ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="BorderBrush" Storyboard.TargetName="ContentPresenter"><DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlHighlightTransparentBrush}"/></ObjectAnimationUsingKeyFrames><ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Foreground" Storyboard.TargetName="ContentPresenter"><DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlHighlightBaseHighBrush}"/></ObjectAnimationUsingKeyFrames><PointerDownThemeAnimation Storyboard.TargetName="RootGrid"/></Storyboard></VisualState><VisualState x:Name="Disabled"><Storyboard><ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Background" Storyboard.TargetName="RootGrid"><DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlBackgroundBaseLowBrush}"/></ObjectAnimationUsingKeyFrames><ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Foreground" Storyboard.TargetName="ContentPresenter"><DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlDisabledBaseLowBrush}"/></ObjectAnimationUsingKeyFrames><ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="BorderBrush" Storyboard.TargetName="ContentPresenter"><DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlDisabledTransparentBrush}"/></ObjectAnimationUsingKeyFrames></Storyboard></VisualState>


                    <!------------- 我加的狀態 ---------------><VisualState x:Name="testState"><Storyboard><ColorAnimation To="Red" Storyboard.TargetName="bkBrush" Storyboard.TargetProperty="Color" Duration="0:0:2" EnableDependentAnimation="True" /></Storyboard></VisualState>


</VisualStateGroup></VisualStateManager.VisualStateGroups><ContentPresenter x:Name="ContentPresenter" AutomationProperties.AccessibilityView="Raw" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" ContentTemplate="{TemplateBinding ContentTemplate}" ContentTransitions="{TemplateBinding ContentTransitions}" Content="{TemplateBinding Content}" HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}" Padding="{TemplateBinding Padding}" VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"/></Grid></ControlTemplate></Setter.Value></Setter></Style>

 

 在上面的代碼中,可以看到鼠標有 "Normal" "PointerOver" "Pressed" "Disabled" 四種狀態。意思一看就知道。

 

那麼這些狀態是怎麼執行的呢?由誰來執行呢?

為了解答這個問題,我添加了一個狀態 "testState"。我添加了一個按鈕,單擊來調用它。

 

private void button1_Click(object sender, RoutedEventArgs e){Windows.UI.Xaml.VisualStateManager.GoToState(button, "testState", true);}

 一點擊button1,就使用 GoToState 調用另一個按鈕的狀態。具體效果看我Demo.

 

那麼我們能調用 PointerOver之類的狀態嗎?答案是肯定的。它由誰來調用,答案也呼之欲出,Button來調用。Button是一個控件,我們只要捕獲鼠標消息,然後在消息處理函數那裡調用 GoToState, 那這一切不就順理成章了嗎?

 

2.UserControl

所以我又寫了一個UserControl,當鼠標放上去時,改變它的背景顏色。

 

<UserControlx:Class="VisualStateManager.MyUserControl1"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="using:VisualStateManager"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"mc:Ignorable="d"d:DesignHeight="300"d:DesignWidth="400"><UserControl.Resources><SolidColorBrush x:Name="RedBrush" Color="Red" /></UserControl.Resources><Grid x:Name="rootGrid" PointerEntered="rootGrid_PointerEntered" Background="Gray" PointerExited="rootGrid_PointerExited"><VisualStateManager.VisualStateGroups><VisualStateGroup><VisualStateGroup.States><VisualState x:Name="Normal" /><VisualState x:Name="PointerOver"><Storyboard><ObjectAnimationUsingKeyFrames Storyboard.TargetName="rootGrid" Storyboard.TargetProperty="Background"><DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource RedBrush}" /></ObjectAnimationUsingKeyFrames></Storyboard></VisualState></VisualStateGroup.States></VisualStateGroup></VisualStateManager.VisualStateGroups></Grid>
</UserControl>

 看Grid的消息響應:

PointerEntered="rootGrid_PointerEntered" Background="Gray" PointerExited="rootGrid_PointerExited"
        private void rootGrid_PointerEntered(object sender, PointerRoutedEventArgs e){Windows.UI.Xaml.VisualStateManager.GoToState(this, "PointerOver", true);}private void rootGrid_PointerExited(object sender, PointerRoutedEventArgs e){Windows.UI.Xaml.VisualStateManager.GoToState(this, "Normal", true);}

然後效果就出來了,鼠標一放上去,背景顏色變紅。SO EASY。

 

但是,如果你仔細看,Normal 狀態,發現它什麼也不做,那為什麼它什麼也不做會還原為原來的灰色背景呢?

 

3.狀態執行的細節

我們就必須要了解這個細節了:

1. 如果控件要转换到的新State有Storyboard,运行该Storyboard。如果控件的旧State有Storyboard,结束其运行。 
2. 如果控件已处于新state状态(即新旧State相同),则GoToState不执行任何操作并返回true。 
3. 如果新State在控件的ControlTemplate中不存在,则GoToState不执行任何操作并返回 false。

以上細節摘自:http://www.cnblogs.com/KeithWang/archive/2012/03/30/2425588.html

 

4.觸發器自動跳轉狀態

 據我研究,微軟只提供了窗口大小改變,然後觸發狀態。。感覺功能很局限啊。不知道有沒有大神知道更多的,然後偷偷地告訴我。

這個東東,最常用的就是當窗口大小改變時,改變程式的界面佈局。假設有一個圖片瀏覽工具,當窗口寬度為100的時候,你只顯示一列。當窗口寬度為200的時候,你就顯示兩列。

又如微軟的視頻顯示中的那樣,在手機中,操作按鈕放在程式最下方,在PC上,操作按鈕放在最右邊。。這個時候可以使用這個東東。。我寫了一個當窗口寬度大於600時,自動拉伸按鈕長度的狀態:

        <VisualStateManager.VisualStateGroups><VisualStateGroup><VisualState><VisualState.StateTriggers><AdaptiveTrigger MinWindowWidth="600" /></VisualState.StateTriggers><VisualState.Setters><Setter Target="button1.Width" Value="500" /></VisualState.Setters></VisualState></VisualStateGroup></VisualStateManager.VisualStateGroups>

如果是改變按鈕的位置,如顯示在下方,改變到顯示到右方,可以看我的這篇博客:WIN10-UWP開發之控件。或許看微軟的示例。

 

好了,就寫到這裡了。

 

转载于:https://www.cnblogs.com/lin277541/p/4881188.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/258223.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hadoop伪分布配置与基于Eclipse开发环境搭建

国内私募机构九鼎控股打造APP&#xff0c;来就送 20元现金领取地址&#xff1a;http://jdb.jiudingcapital.com/phone.html内部邀请码&#xff1a;C8E245J &#xff08;不写邀请码&#xff0c;没有现金送&#xff09;国内私募机构九鼎控股打造&#xff0c;九鼎投资是在全国股份…

百度地图JavaScript API覆盖物旋转时出现偏移

在项目中&#xff0c;调用百度地图JavaScript API&#xff0c;做覆盖物的旋转再添加到地图上&#xff0c;结果出现偏移了。 调试过程中的效果图&#xff1a; 发现图片的旋转并不是按车子的中心来的&#xff0c;而是之外的一个点。最后发现犯了一个很细节的错&#xff1a; <s…

英利1500伏光伏组件系列亮相美国

2016年4月21日&#xff0c;英利宣布其公用事业规模太阳能光伏生产线YGE-U1500系列亮相美国。 近日&#xff0c;美国保险商实验室&#xff08;UL&#xff09;对新型光伏板系列进行认证&#xff0c;可用于最大系统电压为1500伏的项目。 部署英利多晶硅YGE-U 1500光伏组件系列可为…

eclipse 关闭时progress information弹框_Spring开发环境搭建(Eclipse)

开发环境搭建&#xff0c;主要包含2部分:Java安装Eclipse安装为易于学习&#xff0c;我们只安装这2个部分&#xff0c;对于一般开发学习也足够了。如果你有其他要安装的&#xff0c;酌情添加。Java安装我们使用Java8&#xff1a;下载JDK32位下载x86版本&#xff0c;64位下载x64…

紫薯铜锣烧

材料&#xff1a; 全麦粉 三勺 鸡蛋 一只 毅力低脂纯牛奶 半盒 紫薯 蜂蜜 一勺 做法&#xff1a; 1. 鸡蛋打开&#xff0c;加入半盒牛奶&#xff0c;分三次加入三勺全麦面粉&#xff0c;每次加入都要上下搅拌&#xff0c;面粉要过筛&#xff0c;最后加入半勺蜂蜜 2.紫薯蒸熟压…

mysql 四大基础操作_mysql数据库的基本操作

mysql数据库的基本操作首先我们要把mysql装好mkdir chen/mount.cifs //192.168.100.23/LNMP chen/[rootlocalhost ~]# yum -y install \gcc \gcc-c \ncurses \ncurses-devel \bison \cmake[rootlocalhost ~]# useradd -s /sbin/nologin mysql[rootlocalhost ~]# cd chen/[rootl…

如何选择合适的监视器?

1、可视面积 在购买液晶监视器的时候&#xff0c;最先考虑的就是“面子”大小。对于液晶监视器来说&#xff0c;其面板的大小就是可视面积的大小&#xff0c;这一点与CRT监视器有些不同。同样参数规格的监视器&#xff0c;LCD要比CRT的可视面积更大一些&#xff0c;一般15英寸L…

2014年9月6日

第一题&#xff0c;神题不可做。 第二题&#xff0c;傻逼题裸裸的转移。。显而易见。 1 #include<iostream>2 #include<cstdio>3 #include<cstring>4 using namespace std;5 double a[20][20];6 double dp[2000010];7 int main()8 {9 // freopen("b.…

[Labview资料] labview事件结构学习

编程的主要目的是为了实现用户的某种功能&#xff0c;用户通过用鼠标、键盘、程序内部等触发某种程序动作&#xff0c;从而达到某种结果&#xff0c;这些操作都被称作为事件&#xff0c;LabVIEW中相应这些事件最常用的结构就是“事件结构”。事件结构内容丰富&#xff0c;基本上…

干不掉的钉钉:从哪来,往哪去?

作为阿里巴巴最有经验的产品经理之一&#xff0c;陈航习惯了“立项、开发、回到起点”的循环&#xff0c;但最近的一次“回到起点”&#xff0c;却让他记忆犹新。 那是在2014年5月26日&#xff0c;陈航带着一支不到10人的团队从阿里巴巴的西溪园区&#xff0c;搬进了位于杭州文…

《交互式程序设计 第2版》一3.6 关系比较

本节书摘来华章计算机《交互式程序设计 第2版》一书中的第3章 &#xff0c;第3.6节&#xff0c;Joshua Noble 著 毛顺兵 张婷婷 陈宇 沈鑫 任灿江 译更多章节内容可以访问云栖社区“华章计算机”公众号查看。 3.6 关系比较 与元组类型类似&#xff0c;关系类型也逃不过“比较运…

Undefined symbols for architecture i386:_OBJC_CLASS_$_xx, referenced from: 解决方法

多个人共同操作同一个项目或拷贝项目时&#xff0c;经常会出现类似这样的问题&#xff1a; Undefined symbols for architecture i386: "_OBJC_CLASS_$_xx文件名", referenced from: 下面是可能导致这类问题出现的原因及修改&#xff1a; 1.相关工程文件未导入 你可以…

mysql cmake错误_MySQL5.5安装出现CMake错误找不到CMakelists.txt原因-阿里云开发者社区...

今天虚拟机上测试安装 CentOS6.3 PHP5.4.8 MySQL5.5.28&#xff0c;结果捣鼓了半天 MySQL都没装上&#xff0c;老是CMake目录下找不到那个 lists 文件&#xff0c;郁闷的不行&#xff0c;最后发现问题所在&#xff0c;总结在下面(我是把软件包下载错了)&#xff1a;1. 检查参…

node.js Lordofpomelo点击登录(login)终端提示成功,页面不跳转无反应

firbug查看是因为webserver->public->js->lib->build->build.js文件出错 打开https://raw.githubusercontent.com/NetEase/lordofpomelo/master/web-server/public/js/lib/build/build.js复制替换build.js即可转载于:https://www.cnblogs.com/doujinya/p/396616…

LabVIEW设计模式系列——移位寄存器

标准&#xff1a;1、太多移位寄存器会导致连线太多&#xff0c;看起来凌乱&#xff0c;使用簇将变量打包&#xff0c;统一用一个移位寄存器&#xff0c;这样可以减少连线的麻烦2、如果每个变量都使用一个移位寄存器&#xff0c;没有一个名字是很难区分移位寄存器到底属于哪一个…

MySQL过滤相同binlog_通过Linux命令过滤出binlog中完整的SQL语句

DB&#xff1a;MySQL 5.6.16CentOS&#xff1a;CentOS release 6.3 (Final)当insert语句通过空格跨行输入的时候&#xff0c;如何提取完整的insert语句&#xff01;创建一个空表&#xff1a;mysql> create table yoon as select * from sakila.actor where 10;Query OK, 0 r…

●SQL编程

局部变量局部变量必须以 开头&#xff0c;而且必须先用DECLARE 命令说明后才可使用。使用SELECT 或SET 命令来设定变量的值。说明形式&#xff1a;DECLARE 变量名 变量类型 [ 变量名 变量类型]SELECT 局部变量 变量值SET 局部变量 变量值例&#xff1a;declare name varchar(2…

mysql to char 用法_postgresql 中的to_char()常用操作

postgresql中的to_char()用法和Oracle相比&#xff0c;多了一个参数。to_char(待转换值&#xff0c;转换格式);常用转换格式有2种&#xff1a;一个是写若干个0&#xff0c;如果待转换的值位数少于于你定义的转换格式位数&#xff0c;输出值会自动在左边补0&#xff0c;位数补齐…

mysql 数据库名称限制_mysql 数据库名称限制

mysql 数据库名称限制云服务器(Elastic Compute Service&#xff0c;简称ECS)是阿里云提供的性能卓越、稳定可靠、弹性扩展的IaaS(Infrastructure as a Service)级别云计算服务。云服务器ECS免去了您采购IT硬件的前期准备&#xff0c;让您像使用水、电、天然气等公共资源一样便…

Chrome 控制台指南

转自&#xff1a;http://blog.jobbole.com/76985/ Chrome的开发者工具已经强大到没朋友的地步了&#xff0c;特别是其功能丰富界面友好的console&#xff0c;使用得当可以有如下功效&#xff1a; 更高「逼格」更快「开发调试」更强「进阶级的Frontender」Bug无处遁形「Console大…