然后,“离开”状态通常是应该是初始状态的状态.根据我的理解,没有办法在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:设置初始状态所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)