如何从XAML访问元素资源中的故事板?考虑以下代码:...上面的代码很好。现在,我想像这样将MyStory关键帧值绑定到这个用户控件的DP(名为SpecialColor):这会报错:无法冻结此Storyboard时间轴树以供跨线程使用。这可以使用后面的代码来完成。但是我怎么能只在XAML中做呢?代码隐藏助手解决方案:?第1步:将MyStory故事板放入brdBase资源中。...错误:找不到名为“MyStory”的资源。资源名称区分大小写。?第2步:消除IsMouseOver属性上的IsMouseOver并从后面的代码启动MyStory。C#代码隐藏:privatevoidbrdBase_MouseEnter(objectsender,MouseEventArgse){BordergrdRoot=(Border)this.Template.FindName("brdBase",this);故事板故事=grdRoot.Resources["MyStory"]作为故事板;故事开始(这个,这个。模板);}?第3步:解决方案已完成,但第一次不起作用。幸运的是,这个问题有一个解决方法。将ControlTemplate放入Style就足够了。(我需要除EventTrigger之外的其他触发器类型,并且必须用ControlTemplate包装UserControl元素。)更新:关于使用ObjectDataProvider的想法失败了。ObjectDataProvider资源不能用于提供故事板!报错是:AssociatedControlDP总是空的。这是代码:MyStory...StoryboardFinder类:publicclassStoryboardFinder:DependencyObject{#region________________________________________AssociatedControlpublicControlAssociatedControl{get{return(Control)Get(AssociatedControlValue(AssociatedControlProperty);}set{SetValue(AssociatedControlProperty,value}public);stat}只读DependencyPropertyAssociatedControlProperty=DependencyProperty.Register("AssociatedControl",typeof(Control),typeof(StoryboardFinder),newFrameworkPropertyMetadata(null,FrameworkPropertyMetadataOptions.None));#endregionpublicStoryboardFinder(stringresourceName){////controlAssociatedalwaysnull:(//returnnewStoryboard();}}好吧,你不能真正绑定到“To”和“From”,因为必须冻结故事板才能有效地使用跨线程。解决方案1)最简单的解决方案,无需破解(涉及代码隐藏):在事件处理程序中添加一个MouseOver事件处理程序,找到需要的动画,直接设置“To”属性,这种方式不使用绑定,可以完成“冻结”.这样你就不会硬编码:)。解决方案2)有一个很酷的hack只支持XAML(有点转换魔法),但我不推荐它。尽管如此,它还是很酷:)WPF动画:绑定到情节提要动画的“To”属性请参阅Jason的回答。您可以尝试更多的事情:解决方案3)不使用依赖属性,而是实施INotifyProperthChanged。这样你仍然可以绑定“到”。请注意,我认为这在理论上应该可行,但我还没有尝试过。解决方案4)将Mode=OneTime应用于绑定。也许它有效?解决方案5)编写您自己的附加行为,该行为将评估正确线程上的依赖属性并设置“To”属性。我认为这将是一个很好的解决方案。这里也很好复制:WPF动画“无法冻结此情节提要时间轴树以供跨线程使用”如果此代码为真怎么办?如果是这样,我可以在IsMouseOver属性上有一个触发器...我很高兴地说这是一个有效的代码:)我只能在标签中使用EventTriggers。这是极限。所以我开始考虑这个:如果我有一个可以在FrameworkElement.Triggers范围内工作的自定义触发器怎么办?这是代码:使用系统;使用System.Collections.Generic;使用System.ComponentModel;使用System.Windows;使用System.Windows.Interactivity;使用System.Windows.Media.Animation;namespaceTriggerTest{//////InteractiveTrigger是一个可以用作System.Windows.Trigger但在System.Windows.Interactivity中的触发器。//////注意:此类中既没有EnterActions也没有ExitActions。可以使用`CommonActions`代替`EnterActions`。///此外,可以使用类型为System.Windows.Interactivity.TriggerAction的`Actions`属性。////////////System.Windows.Interactivity中只有一种触发器(即EventTrigger)。因此,您可以在此命名空间中使用以下触发器:///1-InteractiveTrigger:Trigger///2-InteractiveMultiTrigger:MultiTrigger///3-InteractiveDataTrigger:DataTrigger//4-InteractiveMultiDataTrigger:MultiDataTrigger//////publicclassInteractiveTrigger:TriggerBase{#region_____________________________________________________________________________属性#region____________________________________________Value//////[ValueProperty的包装属性]//////获取或设置要与之比较的值元素的属性值。比较是引用相等性检查。//////公共对象值{get{return(object)GetValue(ValueProperty);}set{SetValue(ValueProperty,value);}}publicstaticreadonlyDependencyPropertyValueProperty=DependencyProperty.Register("Value",typeof(object),typeof(InteractiveTrigger),newFrameworkPropertyMetadata(null,FrameworkPropertyMetadataOptions.None,OnValuePropertyChanged));privatestaticvoidOnValuePropertyChanged(DependencyObjectsender,DependencyPropertyChangedEventArgse){InteractiveTriggerinstance=senderasInteractiveTrigger;如果(在stance!=null){if(instance.CanFire)instance.Fire();}}#endregion//////获取或设置具有导致应用关联设置器的属性的对象的名称。///publicstringSourceName{get;放;}//////获取或设置返回与此trigger.Value属性比较的值的属性。比较是引用相等性检查。///publicDependencyProperty属性{get;放;}//////获取或设置System.Windows.Setter对象的集合,这些对象描述触发器对象激活时要应用的属性值。///公共列表设置器{get;放;}//////获取或设置在此触发器对象激活时应用的System.Windows.TriggerAction对象的集合。///公共列表CommonActions{get;放;}//////获取一个值,该值指示此触发器是否可以激活以应用设置器和操作。///privateboolCanFire{get{if(this.AssociatedObject==空){返回假;}else{对象关联值;如果(string.IsNullOrEmpty(SourceName))associatedValue=this.AssociatedObject.GetValue(Property);elseassociatedValue=(this.AssociatedObject.FindName(SourceName)asDependencyObject).GetValue(Property);TypeConvertertypeConverter=TypeDescriptor.GetConverter(Property.PropertyType);objectrealValue=typeConverter.ConvertFromString(Value.ToString());返回associatedValue.Equals(realValue);}}}#endregion#region_____________________________________________________________________________方法//////通过设置设置器值和调用所有操作来触发(激活)当前触发器。///privatevoidFire(){////将setter值设置为其关联的属性..//foreach(Setter中的Settersetter){if(string.IsNullOrEmpty(setter.TargetName))this.AssociatedObject.SetValue(setter.Property,setter.Value);否则(this.AssociatedObject.FindName(setter.TargetName)作为DependencyObject).SetValue(setter.Property,setter.Value);}////触发动作..//foreach(CommonActions中的System.Windows.TriggerAction动作){TypeactionType=action.GetType();if(actionType==typeof(BeginStoryboard)){(actionasBeginStoryboard).Storyboard.Begin();否则抛出新的NotImplementedException();}this.InvokeActions(null);}#endregion#region____________________________________________________________________________________________________________________________________________________________________________________________________________________________________CommonActions=newList();}protectedoverridevoidOnAttached(){base.OnAttached();if(Property!=null){objectpropertyAssociatedObject;如果(string.IsNullOrEmpty(SourceName))propertyAssociatedObject=this.AssociatedObject;elsepropertyAssociatedObject=this.AssociatedObject.FindName(SourceName);////添加属性更改侦听器到属性关联对象..//DependencyPropertyDescriptordpDescriptor=DependencyPropertyDescriptor.FromProperty(属性,propertyAssociatedObject.GetType());dpDescriptor.AddValueChanged(propertyAssociatedObject,PropertyListener_ValueChanged);}}protectedoverridevoidOnDetaching(){base.OnDetaching();if(Property!=null){objectpropertyAssociatedObject;如果(string.IsNullOrEmpty(SourceName))propertyAssociatedObject=this.AssociatedObject;elsepropertyAssociatedObject=this.AssociatedObject.FindName(SourceName);////从关联对象中移除先前添加的属性更改侦听器。//DependencyPropertyDescriptordpDescriptor=DependencyPropertyDescriptor.FromProperty(Property,propertyAssociatedObject.GetType());dpDescriptor.RemoveValueChanged(propertyAssociatedObject,PropertyListener_ValueChanged);}}privatevoidPropertyListener_ValueChanged(objectsender,EventArgse){if(CanFire)Fire();}#endregion}}我还创建了其他触发器类型(即InteractiveMultiTrigger,InteractiveDataTrigger,InteractiveMultiDataTrigger)和一些使条件和多条件EventTriggers成为可能的操作如果专业人士确认此解决方案,我将发布所有内容。感谢您的关注!以上是C#学习教程:HowtoaccessthestoryboardintheelementresourcefromXAML?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
