Silverlight中的VisualStateManager:设置初始状态

Silverlight中的VisualStateManager:设置初始状态,第1张

概述我经常发现需要包括“离开”和“现在”类型的视觉状态,这些视觉状态用于根据某些其他条件使控件动画离开或可见. 然后,“离开”状态通常是应该是初始状态的状态.根据我的理解,没有办法在SL中定义初始状态,而是“base”,这根本不是一个状态,而是表示状态管理器尚未激活的状态(没有状态故事板运行到改变控件的外观). 当然你可以设计“base”看起来像“离开”,但这意味着Expression Blend中的 我经常发现需要包括“离开”和“现在”类型的视觉状态,这些视觉状态用于根据某些其他条件使控件动画离开或可见.

然后,“离开”状态通常是应该是初始状态的状态.根据我的理解,没有办法在SL中定义初始状态,而是“base”,这根本不是一个状态,而是表示状态管理器尚未激活的状态(没有状态故事板运行到改变控件的外观).

当然你可以设计“base”看起来像“离开”,但这意味着Expression Blend中的默认外观是不可见的(你不能永久地“固定”状态).

要改变我尝试的初始状态

>在控件的ctor中设置状态,它什么都不做
>在来自ctor或Loaded事件的调度调用中设置状态,这两个事件都显示错误状态为瞬间.

所以问题似乎是无论视觉状态管理器做了什么,它都不会立即执行,但需要一个明显的瞬间改变外观.

(当然,为引导程序直接设置属性是另一种选择,但仅适用于UserControls:在模板化控件中,我必须引入另一个depprop模板绑定控件模板,这是我认为过度开始的地方.)

我想我已经涵盖了所有这一切,我只能忍受一个看不见的基础状态?

我用的是SL4.

解决方法 在Expression Blend中为 WPF开发UserControl时遇到了类似的问题(注意:如果您正在开发自定义控件,请参阅下一节).在那个UserControl中,我有一个我希望淡入的子元素,并作为叠加层存在.与您的情况一样,在我的工作流程中首先将覆盖元素设计为“完全成长和可见”状态,然后将其缩小并将其不透明度设置为“隐藏”状态.这样做,覆盖在Base状态下可见,但我需要UserControl的初始状态为隐藏状态.在这一点上,我有三个主要的相关状态:Base,“HIDden”和“Visible”(最后两个是State组的一部分).

这是我解决初始状态问题的方法.首先,我将GoToStateAction应用于由Loaded事件触发的根元素(到UserControl).它告诉UserControl直接进入“隐藏”状态:

<i:Interaction.Triggers>  <i:EventTrigger>    <ei:GoToStateAction Targetobject="{Binding Elementname=userControl}" Statename="HIDden"/>  </i:EventTrigger></i:Interaction.Triggers>

其次,我在状态组中为叠加层进行了适当的转换设置.可能有几种方法可以做到这一点,但这就是我如何做到的.首先,我将“默认转换”设置为令人满意的设置,比如说.4秒.接下来,我将从任何元素(Blend中的星形图标)到此“隐藏”状态的转换时间设置为0秒(这允许上述GoToStateAction设置“初始”状态,而用户不知道任何不同).然后,我将从“可见”状态到“隐藏”状态的转换设置为适当的设置(比如.4秒).基本上这涵盖了过渡的所有基础.关键是要确保从“任何元素”到“隐藏”状态的“转换”是立即的,然后在从叠加层的“可见”到“隐藏”状态的情况下覆盖那个立即转换.

设置自定义控件的初始VisualState

如果您正在开发自定义控件(而不是UserControl)并因此在控件模板中定义visualstatemanager,则上述方法(基于Loaded事件启动VisualState更改)可能不起作用.这是因为在调用OnApplyTemplate()重写之前,控件的可视树(在样式文件中定义)将被应用于您的控件,这通常是在第一个Loaded事件被触发之后.因此,如果您尝试启动VisualState更改以响应自定义控件的Loaded事件,则很可能不会发生任何事情.相反,您需要在OnApplyTemplate()覆盖代码中启动状态更改:

public class MyCustomControl : ContentControl{    // ... other code ....    public MyCustomControl()    {        // avoID designer errors        if (DesignerPropertIEs.GetIsInDesignmode(this))            return;        Loaded += new RoutedEventHandlerMyCustomControl_Loaded);    }    // This probably won't be called until AFTER OnApplyTemplate() gets    //  called,so don't expect for your control to even have a visual tree    //  yet when your control is first being contructed at runtime.    private voID MyCustomControl_Loaded(object sender,RoutedEventArgs e)    {    }    public overrIDe voID OnApplyTemplate()    {        // AvoID Visual Studio 2010 designer exceptions        // (Visual Studio can't handle the VisualState change at design-time)        if (DesignerPropertIEs.GetIsInDesignmode(this))            return;        base.OnApplyTemplate();        // Now we kNow that the template has been applIEd,we have a visual tree,//  so state changes will work        visualstatemanager.GoToState(this,"MyInitialState",false);    }}
总结

以上是内存溢出为你收集整理的Silverlight中的VisualStateManager:设置初始状态全部内容,希望文章能够帮你解决Silverlight中的VisualStateManager:设置初始状态所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/web/1005464.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存