i have animation animates canvas turning 360 degrees indefinitely (it spins). want animation start when control shown , stop when control hidden. figured tie in, somehow, visualstatemanager. have seen example of fading in , out controls here work dont know how use vsm start , stop storyboard
<canvas.resources> <storyboard x:name="spinnerboard"> <doubleanimation storyboard.targetname="spinnerrotate" storyboard.targetproperty="angle" from="0" to="360" duration="0:0:01.3" repeatbehavior="forever" /> </storyboard> </canvas.resources> <canvas.rendertransform> <rotatetransform x:name="spinnerrotate" angle="0" /> </canvas.rendertransform> example vsm
<visualstate x:name="show"> <storyboard> <!-- start story board here --> </storyboard> </visualstate> <visualstate x:name="hide"> <storyboard> <!-- stop story board here --> </storyboard> </visualstate>
a global answer of different questions :
extendedvisualstatemanager.gotoelementstate returns false in silverlight
default binding usercontrol custom dp
you can :
- use template control extend
contentcontrolplayisenabledof content (prevent action during waiting) ; - create dp
iswaitingswitch control visual state ; - create 2 states in xaml : use
doubleanimationrepeatbehavior="forever"
after can add overlay , waiting message dependency property busy indicator control...
i use picture waiting visual part can use canvas, grid etc...
c#
[templatevisualstate(groupname = "waitgroup", name = waitspinner.iswaitingstatename)] [templatevisualstate(groupname = "waitgroup", name = waitspinner.notwaitingstatename)] public class waitspinner : contentcontrol { #region states names internal const string iswaitingstatename = "iswaitingstate"; internal const string notwaitingstatename = "notwaitingstate"; #endregion states names public bool iswaiting { { return (bool)getvalue(iswaitingproperty); } set { setvalue(iswaitingproperty, value); } } public static readonly dependencyproperty iswaitingproperty = dependencyproperty.register("iswaiting", typeof(bool), typeof(waitspinner), new propertymetadata(false, oniswaitingpropertychanged)); private static void oniswaitingpropertychanged(dependencyobject sender, dependencypropertychangedeventargs e) { waitspinner waitspinner = (waitspinner)sender; waitspinner.changevisualstate(true); } public waitspinner() { defaultstylekey = typeof(waitspinner); } public override void onapplytemplate() { base.onapplytemplate(); changevisualstate(false); } protected virtual void changevisualstate(bool usetransitions) { visualstatemanager.gotostate(this, iswaiting ? iswaitingstatename : notwaitingstatename, usetransitions); } } xaml :
<visualstategroup x:name="waitgroup"> <visualstate x:name="notwaitingstate" > <storyboard> <objectanimationusingkeyframes storyboard.targetproperty="(control.isenabled)" storyboard.targetname="content"> <discreteobjectkeyframe keytime="0"> <discreteobjectkeyframe.value> <system:boolean>true</system:boolean> </discreteobjectkeyframe.value> </discreteobjectkeyframe> </objectanimationusingkeyframes> </storyboard> </visualstate> <visualstate x:name="iswaitingstate"> <storyboard> <objectanimationusingkeyframes storyboard.targetproperty="(uielement.visibility)" storyboard.targetname="waitpart"> <discreteobjectkeyframe keytime="0:0:0.200" value="visible"/> </objectanimationusingkeyframes> <doubleanimation storyboard.targetproperty="(uielement.rendertransform).(rotatetransform.angle)" storyboard.targetname="waitpart" to="360" repeatbehavior="forever" duration="0:0:1" /> <objectanimationusingkeyframes storyboard.targetproperty="(control.isenabled)" storyboard.targetname="content"> <discreteobjectkeyframe keytime="0"> <discreteobjectkeyframe.value> <system:boolean>false</system:boolean> </discreteobjectkeyframe.value> </discreteobjectkeyframe> </objectanimationusingkeyframes> </storyboard> </visualstate> </visualstategroup> <!-- ............. --> <contentcontrol istabstop="false" x:name="content" content="{templatebinding content}" contenttemplate="{templatebinding contenttemplate}" horizontalcontentalignment="{templatebinding horizontalcontentalignment}" verticalcontentalignment="{templatebinding verticalcontentalignment}" foreground="{templatebinding foreground}" scrollviewer.horizontalscrollbarvisibility="{templatebinding scrollviewer.horizontalscrollbarvisibility}" scrollviewer.verticalscrollbarvisibility="{templatebinding scrollviewer.verticalscrollbarvisibility}"/> <image source="circlepicture.png" x:name="waitpart" rendertransformorigin="0.5,0.5" width="16" height="16" visibility="collapsed" ishittestvisible="false"> <image.rendertransform> <rotatetransform /> </image.rendertransform> </image>
Comments
Post a Comment