ResourceDictionaryWPF中样式中的交互触发器我有一个ComboBox,我需要在我的应用程序中的几个地方使用它,所以我在ResourceDictionary中设置了它的大部分属性ComboBox并将其用作我需要的样式。ComboBox样式是:我在我的XAML中这样使用它:我也想将交互触发代码移动到ResourceDictionary,因此我不需要在所有xaml中都写它。是否可以?据我所知,Interaction.Triggers不能分别应用于Style和ResourceDictionary。但是您可以通过将ComboBox标识为具有x:Shared="False"的资源并将其引用为ContentControl来实现这一点:默认情况下,当x:Shared="True"时,所有样式都是通用的–在此在这种情况下,系统以重复的内容发誓。设置x:Shared="False"时为每个元素创建样式。引用自MSDN:当设置为false时,修改WPF资源检索行为,以便对属性资源的请求为每个请求创建一个新实例,而不是为所有请求共享同一个实例。有关详细信息,请参阅:MSDN:x:SharedAttributeEdit:alternativesolution在这里,Mr.Vspivak发布了一个解决方案,使您可以轻松地在Style中设置Interaction.Triggers。示例:MainWindow.xamlInteractivityHelper.cs//////用于InteractivityElements实例///子类化以实现向前兼容性,也许有一天///将不再部分内部///publicclassInteractivityTemplate:DataTemplate{}//////交互条目的持有者///publicclassInteractivityItems:FrameworkElement{privateList_behaviors;私有列表_triggers;//////触发器存储///publicListTriggers{get{if(_triggers==null)_triggers=newList();返回触发器;}}//////行为存储///publicListBehaviors{get{if(_behaviors==null)_behaviors=newList();返回_行为;}}#region模板附加属性publicstaticInteractivityTemplateGetTemplate(DependencyObjectobj){return(InteractivityTemplate)obj.GetValue(TemplateProperty);}publicstaticvoidSetTemplate(DependencyObjectobj,InteractivityTemplatevalue){obj.SetValue(TemplateProperty,value);}publicstaticreadonlyDependencyPropertyTemplateProperty=DependencyProperty.RegisterAttached("Template",typeof(InteractivityTemplate),typeof(InteractivityItems),newPropertyMetadata(default(InteractivityTemplate),OnTemplateChanged));privatestaticvoidOnTemplateChanged(DependencyObjectd,DependencyPropertyChangedEventArgse){InteractivityTemplatedt=(InteractivityTemplate)e.NewValue;#if(!SILVERLIGHT)dt.Seal();#endifInteractivityItemsih=(InteractivityItems)dt.LoadContent();BehaviorCollectionbc=Interaction.GetBehaviors(d);TriggerCollectiontc=Interaction.GetTriggers(d);foreach(ih.Behaviors中的行为行为)bc.Add(behavior);foreach(ih.Triggers中的TriggerBase触发器)tc.Add(trigger);}#endregion}FlipOnHover.cspublicclassFlipOnHover:Behavior{protectedoverridevoidOnAttached(){AssociatedObject.MouseEnter+=AssociatedObject_MouseEnter;关联对象.MouseLeave+=AssociatedObject_MouseLeave;变换t=AssociatedObject.RenderTransform;AssociatedObject.RenderTransform=newTransformGroup();((TransformGroup)AssociatedObject.RenderTransform).Children.Add(t);((TransformGroup)AssociatedObject.RenderTransform).Children.Add(newScaleTransform());base.OnAttached();}voidAssociatedObject_MouseLeave(objectsender,System.Windows.Input.MouseEventArgse){((ScaleTransform)((TransformGroup)AssociatedObject.RenderTransform).Children[1]).ScaleY=1;}voidAssociatedObject_MouseEnter(objectsender,System.Windows.Input.MouseEventArgse){((ScaleTransform)((TransformGroup)AssociatedObject.RenderTransform).Children[1]).CenterX=AssociatedObject.ActualWidth/2;((ScaleTransform)((TransformGroup)AssociatedObject.RenderTransform).Children[1]).CenterY=AssociatedObject.ActualHeight/2;((ScaleTransform)((TransformGroup)AssociatedObject.RenderTransform).Children[1]).ScaleY=-1;}受保护的覆盖无效OnDetaching(){base.OnDetaching();AssociatedObject.MouseEnter-=AssociatedObject_MouseEnter;AssociatedObject.MouseLeave-=AssociatedObject_MouseLeave;}}ViewModel.cs公共类ViewModel{私有ObservableCollection_dataSource=newObservableCollection()。(“猫”);_dataSource.Add("狗");_dataSource.Add("鼠标");_dataSource.Add("猫头鹰");_dataSource.Add("兔子");}publicIEnumerableDataSource{get{return_dataSource;有关详细信息,请参阅此链接:在WPF/Silverlight样式中使用交互行为和操作我通常使用Silverlight,所以我不确定以下方法在WPF中是否合理:您可以将xaml拉入UserControl,例如BranchSelection.xaml:并这样使用:以上是C#学习教程:WPF样式中的ResourceDictionary交互触发器分享的全部内容。如果对您有用,需要进一步了解C#学习教程,希望您多加关注—本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处:
