【飞秋】使用C++语言创建Silverlight中的VisualState

WinRT原理深度解析:元数据驱动的跨语言沙箱API设计 WinRT是微软为应对设备形态碎片化而构建的现代系统级API抽象层,其核心在于以ECMA-335元数据为契约、通过投影(Projection)机制实现C++/C#/JavaScript三语言统一调用。它并非替代Win32,而是为其叠加可验证、可组合、生命周期感知的沙箱执行模型,解决传统Windows平台长期存在的API熵增、互操作胶水困境与安全信任赤字三大顽疾。该架构支撑高DPI响应式XAML UI、声明式能力管控与异步优先编程范式,成为UWP及后续Windows App SDK演进的重要基石,也为理解跨平 阅读详情

Silverlight中的VisualState(可视状态)是一个非常重要的概念,使用VisualState,可以将界面的各个状态进行有效的区隔开,并进行单独的设计,并且可以在状态切换时实现动画效果,一般来说,可以通过blend2(微软提供的可视化编程工具)进行设计,但是如果需要动态读取数值并进行设置的话,就需要使用本地的C++代码来编写各个VisualState,下面通过示例展示如何通过编写C++代码来实现与xaml代码同样的功能。

 

如下所示,xaml文件创建了一个状态,并在该状态下,将矩形旋转了75度。


<UserControl
 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 x:Class="SilverlightApplication30.Page"
 Width="640" Height="480" xmlns:vsm="clr-namespace:System.Windows;assembly=System.Windows" x:Name="Root">

 <Grid x:Name="LayoutRoot" Background="White">
  <vsm:VisualStateManager.VisualStateGroups>
   <vsm:VisualStateGroup x:Name="VisualStateGroup">
    <vsm:VisualStateGroup.Transitions>
     <vsm:VisualTransition GeneratedDuration="00:00:01"/>
    </vsm:VisualStateGroup.Transitions>
    <vsm:VisualState x:Name="State1">
     <Storyboard>
      <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000"

Storyboard.TargetName="rectangle" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[2].(RotateTransform.Angle)">
       <SplineDoubleKeyFrame KeyTime="00:00:00" Value="75"/>
      </DoubleAnimationUsingKeyFrames>
     </Storyboard>
    </vsm:VisualState>
   </vsm:VisualStateGroup>
  </vsm:VisualStateManager.VisualStateGroups>
  <Rectangle Margin="168,168,208,192" x:Name="rectangle" RenderTransformOrigin="0.5,0.5" Fill="#FF8E1919" Stroke="#FF000000">
   <Rectangle.RenderTransform>
    <TransformGroup>
     <ScaleTransform/>
     <SkewTransform/>
     <RotateTransform/>
     <TranslateTransform/>
    </TransformGroup>
   </Rectangle.RenderTransform>
  </Rectangle>
 </Grid>
</UserControl>

 

下面,一层层分析,使用本地代码来实现等效的功能:

 

首先,创建一个IXRVisualStateGroupCollection(即状态组的集合),并与Grid进行绑定

 

IXRVisualStateGroupCollection* pVisualStateGroups;
app->CreateObject(IID_IXRVisualStateGroupCollection, &pVisualStateGroups);
LayoutRoot->SetAttachedProperty(L"VisualStateManager.VisualStateGroups", pVisualStateGroups);

 

创建一个状态组,并将其添加到状态组集合中

 

IXRVisualStateGroupPtr pGroup;
app->CreateObject(IID_IXRVisualStateGroup,&pGroup);
pGroup->SetName(L"VisualStateGroup");
pVisualStateGroups->Add(pGroup,NULL);

 

通过状态组下的IXRVisualTransitionCollection来设置通用的切换时间,现在暂定为1秒

 

IXRVisualTransitionCollectionPtr transitions;
app->CreateObject(IID_IXRVisualTransitionCollection,&transitions);
pGroup->SetTransitions(transitions);
IXRVisualTransitionPtr transtion;
app->CreateObject(IID_IXRVisualTransition,&transtion);
XRDuration duration;
duration.DurationType = duration.DurationType_TimeSpan;
duration.TimeSpan.Ticks = duration.TimeSpan.TicksPerSecond;
transtion->SetGeneratedDuration(&duration);
transitions->Add(transtion,NULL);

 

创建状态集合,并将新建的状态添加进去

 

IXRVisualStateCollectionPtr StateCollection;
pGroup->GetStates(&StateCollection);
IXRVisualStatePtr state;
app->CreateObject(IID_IXRVisualState,&state);
state->SetName(L"State1");
StateCollection->Add(state,NULL);

 

创建一个新的故事板,并将其设置到刚创建的状态中

 

IXRStoryboardPtr Storyboard;
app->CreateObject(IID_IXRStoryboard,&Storyboard);
state->SetStoryboard(Storyboard);

 

创建一个IXRDoubleAnimationUsingKeyFrames对象,将它添加到故事板中,
[注:IXRDoubleAnimationUsingKeyFrames派生自IXRTimeline,通过在不同帧时对同一属性设置不同的数值来实现动画效果]

 

IXRTimelineCollectionPtr children;
Storyboard->GetChildren(&children);
IXRDoubleAnimationUsingKeyFramesPtr animation;
app->CreateObject(IID_IXRDoubleAnimationUsingKeyFrames,&animation);
children->Add(animation,NULL);

 

设置animation对象的通用属性

 

XRTimeSpan span;
memset(&span,0,sizeof(XRTimeSpan));
animation->SetBeginTime(&span);
animation->SetBeginTime(&span);
animation->SetDuration(&duration);
animation->SetAttachedProperty(L"Storyboard.TargetName",L"rectangle");
animation->SetAttachedProperty(L"Storyboard.TargetProperty",L"(UIElement.RenderTransform).(TransformGroup.Children)[2].(RotateTransform.Angle)");

 

创建新的一帧,并将其添加到animation的帧集合中

 

IXRDoubleKeyFrameCollectionPtr frameCollection;
animation->GetKeyFrames(&frameCollection);
IXRSplineDoubleKeyFramePtr keyFrame;
app->CreateObject(IID_IXRSplineDoubleKeyFrame,&keyFrame);
XRKeyTime time;
time.Ticks = time.TicksPerSecond;
keyFrame->SetKeyTime(&time);
keyFrame->SetValue(75);
frameCollection->Add(keyFrame,NULL);

 

OK,大功告成,转换状态,看到了矩形的变化过程

 

Root->GoToVisualState(L"State1",true);

关注技术文章飞秋:http://www.freeeim.com/,24小时专业转载。

IAR VisualSTATE 6.41 part1 IAR VisualSTATE 6.41及破解方法。目前最新版,网上没有破解方法贴子,我这个是第一个,呵呵。。。 立即下载

相关推荐

wince自绘列表(Image list)

wince平台上的自绘列表,自绘了滚动条。

在wince中使用C++语言创建Silverlight的VisualState

Silverlight中的VisualState(可视状态)是一个非常重要的概念,使用VisualState,可以将界面的各个状态进行有效的区隔开,并进行单独的设计,并且可以在状态切换时实现动画效果,一般来说,可以通过blend2(微软提供的可视化编程工具)进行设计,但是如果需要动态读取数值并进行设置的话,就需要使用本地的C++代码来编写各个VisualState,下面通过示例展示如何...

amdsp3000的博客 174

IAR VisualSTATE 6.41 破解

IAR VisualSTATE 6.41及破解方法。目前最新版,网上没有破解方法贴子,我这个是第一个,呵呵。。。 注:这个是破解。

使用C++语言创建VisualState

   silverlight中的VisualState(可视状态)是一个非常重要的概念,使用VisualState,可以将界面的各个状态进行有效的区隔开,并进行单独的设计,并且在状态切换间可以通过设置切换时间来实现动画效果,一般来说,可以通过blend2(微软提供的可视化编程工具)进行设计,但是如果需要动态读取数值并进行设置的话,就需要使用本地的C++代码来编写各个VisualState,下面通过示例展示如何通过编写C++代码来实现与xaml代码同样的功能。如下所示,xaml文件创建了一个状态,并在该状态下

嵌入式应用程序开发 654

c++builder列表框控件的用法示例

源代码是一个C++BUILDER列表框控件用法的很好实例

告别Windows!Oculus Quest 2在Mac M1上的串流实战(scrcpy+SideQuest避坑指南)

本文为Mac M1用户提供了Oculus Quest 2在macOS上实现高清低延迟串流的实战指南。通过使用开源工具scrcpy和SideQuest,绕开官方限制,详细讲解了从环境准备、无线调试到画质与延迟优化的完整步骤,重点解决了Apple Silicon芯片Mac的连接与性能问题,助你告别Windows依赖。

weixin_29224309的博客 311

在WINCE中使用C++语言创建SILVERLIGHT的VISUALSTATE

Silverlight中的VisualState(可视状态)是一个非常重要的概念,使用VisualState,可以将界面的各个状态进行有效的区隔开,并进行单独的设计,并且可以在状态切换时实现动画效果,一般来说,可以通过blend2(微软提供的可视化编程工具)进行设计,但是如果需要动态读取数值并进行设置的话,就需要使用本地的C++代码来编写各个VisualState,下面通过示例展示如何通过编写C+

记事本 1037

自动驾驶系统架构解析:从传感器到决策控制的完整链路(附实际案例)

本文深入解析了自动驾驶系统从感知、决策到控制的完整架构链路。通过对比摄像头、毫米波雷达、激光雷达等核心传感器的特性与选型策略,阐述了多传感器融合的必要性。文章结合行为决策、运动规划及控制执行的实际案例,揭示了系统集成、数据闭环与功能安全等工程化落地的关键挑战,为理解自动驾驶技术提供了清晰的蓝图。

weixin_29051811的博客 339

UE4集成NoesisGUI实战:超越UMG的高性能UI开发指南

在现代游戏和应用开发中,用户界面(UI)的性能、表现力和开发效率至关重要。原生UI系统在处理复杂动态界面时,常面临性能瓶颈和设计还原度挑战。数据绑定技术通过建立视图与数据模型的自动同步机制,是实现高效、响应式UI的核心原理,它能显著减少手动更新代码,提升开发体验。NoesisGUI作为一款基于XAML的第三方UI解决方案,凭借其声明式UI、强大的数据绑定和矢量图形渲染能力,为开发者提供了构建高性能、跨平台且设计自由度极高的用户界面的技术价值。它尤其适用于需要复杂数据可视化、动态交互和高保真设计的应用场景,例

weixin_33725807的博客 374

代码详解——Transformer

对于一个序列,在 time_step 为 t 的时刻,我们的解码输出应该只能依赖于 t 时刻之前的输出,而不能依赖 t 之后的输出。当 Decoder 的输入矩阵和 Mask 矩阵输入矩阵包含 “ I have a cat” (0, 1, 2, 3, 4) 五个单词的表示向量,Mask 是一个 5×5 的矩阵。然后判断是否传入的mask, 如果有mask (mask参数值不为None),则把mask为0的位置,将对应位置的attn的值设为无穷小的负数。可以发现得到的输出和输入的K,Q,V的大小相同。

zyw2002的博客 7218

使用VS Code创建第一个Flutter工程

你可以使用任意文本编辑器结合命令行工具来开发Flutter应用。然而,我们推荐使用本文介绍的编辑器插件以获取更好的开发体验。这些插件提供了代码补全、代码高亮、widget辅助编辑等功能,以及为项目的运行和调试提供支持。推荐的开发工具有VS Code、Android Studio、IntelliJ。本文将重点介绍如何使用VS Code进行Flutter应用开发。

2501_91373349的博客 2129

Silverlight中使用MVVM(1)

Silverlight中使用MVVM(1)--基础 Silverlight中使用MVVM(2)—提高 Silverlight中使用MVVM(3)—进阶 Silverlight中使用MVVM(4)—演练 这是我第一篇关于设计模式方面的文章,以前除了对单例模式等几个常用的模式有所研究之外,对设计模式不是太重视,总觉得要到一定的程度才需要接触, ...

weixin_30546933的博客 174

沙猫群优化算法(SCSO)详解:从沙漠生存智慧到全局优化引擎

本文详细介绍了沙猫群优化算法(SCSO),这是一种新型元启发式优化算法,灵感来源于沙猫在沙漠环境中的卓越狩猎行为。SCSO通过模拟沙猫的低频探测能力和精确攻击策略,将优化问题转化为搜索和捕获"猎物"的过程。算法核心包括探索阶段(全局搜索)和开发阶段(局部精细搜索),通过灵敏度范围模型和自适应控制参数实现两者的平衡。SCSO具有参数简单、收敛性能好等优点,适用于解决复杂全局优化问题。

qq_42212808的博客 202

飞秋实现的原理

(1)最关键的是局域网用户列表的建立;飞秋启动时使用UDP协议向255.255.255.255这个广播地址发送广播包,默认端口是2425。广播包内容包含用户名、工作组、主机名、IP等信息; 已启动飞秋的用户通过2425端口收到此广播包后,就会在自己的用户列表中添加这个用户的用户名、工作组等信息,同时向对方IP发送本机用户的个人信息;从而双方都能建立起用户列表; (2)刷新用户列表时发送的广播包

北极光下 7175

【Android Performance】Android CPU绑核实战:从taskset到cpuset的完整调优指南

本文系统讲解Android系统中的CPU绑核(CPU Affinity)技术,涵盖用户空间的taskset命令行绑核、内核cpuset分组机制的原理与操作、进程级与线程级绑核的代码实现、以及中断绑核的底层方法。文中深入拆解CPU亲和性掩码的计算规则、各cpuset分组的默认策略差异、绑核后的验证手段及常见踩坑场景,并配有多项实操命令与C代码示例。适合从事Android系统性能调优、进程调度优化的开发者阅读。

weixin_44081096的博客 1315

智慧加油站小程序数据库设计文档

【代码】智慧加油站小程序数据库设计文档。

低代码布道师的博客 1405

深挖C++:类和对象(中)

(先进后出)

xys_678的博客 255

风电功率预测 | 基于RF随机森林的风电功率预测(附matlab完整源码)

风电功率预测 | 基于RF随机森林的风电功率预测(附matlab完整源码)

天天酷科研的博客 897

跟我学c++中级篇—类型定义的方式

本文系统阐述了编程中类型定义的重要性及c++中的实现方式。重点对比了宏定义、typedef与modern using三种机制,指出using在可读性、灵活性和模板支持上的优势,推荐优先使用。同时提醒开发者注意别名滥用、类型歧义、错误信息冗长等问题,强调统一规范与合理设计。最终结论:在现代c++开发中,应以using为主,兼顾简洁性与可维护性,避免陷入命名混乱与编译困境。

fpcc的专栏 393

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【C++——类和对象(上)】筑基篇:以封装奠定面向对象之基

本文系统梳理C++类与对象的核心知识点,涵盖类的定义、访问限定符(public/private)、类作用域、对象实例化及内存布局。重点解析封装思想、this指针机制、空类大小为1字节的原因,以及类与对象在内存中的存储差异。通过对比C语言结构体与C++类,揭示面向对象设计的优势:数据保护、接口统一、命名隔离与代码可维护性提升。内容由浅入深,适合作为学习笔记与复习参考。

2602_95684935的博客 626

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【C++】C++17的主要特性

C++17引入多项重要特性:结构化绑定简化多值返回与遍历;inline变量解决头文件中变量定义的ODR问题,支持类内初始化;if/switch初始化语句允许在条件中声明变量,提升代码简洁性;属性语法(如[[nodiscard]]、[[deprecated]])增强代码可读性与安全性;求值顺序明确化,提高程序可预测性。这些改进显著提升了代码的简洁性、安全性和可维护性。

记录我一步步的学习历程,期待无限进步,向星举目! 313

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【C++碎片化知识补充】C++ 里 int 也算对象?聊聊对象和变量的边界

盯着sessionId不就是个变量吗?变量凭什么能调用函数?后来才反应过来——它当然是对象。是我把对象这个词理解窄了。

2501_93351213的博客 312

【C++ 基础入门】C++11新特性(下):可变参数模板、lambda 表达式与包装器

C++11高阶特性(可变参数模板与参数包展开、emplace_back、lambda表达式与捕获列表、仿函数、std::function包装器)

2601_96587588的博客 244

#SQLite 数据库笔记一:(概念 / 终端指令 / SQL 语句 / C 编程 / 回调函数)

数据库 = 数据的仓库,假设数据是海量。能力说明存储数据持久化保存,程序退出数据还在统计数据、分组、排序数据管理增、删、改、查(CRUD)嵌入式设备上也会用数据库(单片机网关、路由器、工业 HMI 都常见),因为 sqlite 体积小、无需服务进程、单文件即可。数据库 = 库 > 表 > 记录(行) > 字段(列)sqlite3 = 开源、C 写的、单文件、免安装、最多 2T 的嵌入式关系型数据库。

lwq20051110的博客 259
上一篇: 【飞秋】记一次“偷盗”别人的CSS和Js
下一篇: 【飞秋】位运算与组合搜索(二)
普通网友
博客等级 码龄22年 1万+粉丝 3156原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值