2011-03-03 41 views
3

我试图为支持拖放的列表框添加一些视觉反馈。似乎我应该能够添加一些setter到一个EventSetter并完成。但是,事件提供者不支持setter。我真的必须制作故事板来实现这种行为吗?为什么我不能在事件触发器中放置一个Setter

微软对此有何理性?

<Style TargetType="{x:Type ListBox}"> 
     <Style.Triggers> 
      <EventTrigger RoutedEvent="DragEnter"> 
       <!--WHy Can't i Add seters here? e.g. 
       <Setter Property="ForeColor" Value="Red"> 
       --> 
      </EventTrigger> 
     </Style.Triggers> 
    </Style> 

回答

7

一个二传手并不只是设置属性响应状态改变,这也将财产恢复到以前的值时,状态改回。事件触发器没有“变回”,因此将setter与它们一起使用就像将某些东西推到一个永远不会弹出的栈上。

我觉得在这种情况下一个更好的问题是“为什么没有IsDragOver属性?”

3

你也许会尝试这样的事情?这是一个奇怪的伪代码,我没有VS来测试它,但它应该可以工作。使用反射器,你应该能够反向设计SetterAction,理论上这个Setter的工作方式几乎完全相同。

<TextBox Text="ListBox" > 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="DragEnter" > 
      <behavior:SetterAction Property="ListBox.ForeColor" Value="Red"/> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
</TextBox> 

public class SetterAction : TargetedTriggerAction<FrameworkElement> 
{  
    public DependencyProperty Property { get; set; } 
    public Object Value { get; set; } 


    protected override void Invoke(object parameter) 
    {     
     AssociatedObject.SetValue(Property, Value);  
    } 
} 
+0

嗨Lugoues。你能解释更多关于你的解决方案吗?什么是TargetedTriggerAction它是一个.net类?我发现这个页面https://msdn.microsoft.com/en-us/library/ff726545(v=expression.40).aspx,但我无法找到程序集中的System.Windows.Interactivity – Mamad 2017-03-05 11:51:38

+0

@Mamad你可以找到系统。混合sdk中的Windows.Interactivity程序集。 http://www.nuget.org/packages/Expression.Blend.Sdk/ – Lugoues 2017-03-07 00:40:58

+0

+1是使用Storyboard和行为的不错选择。在这里,我认为背后的简单代码值得使用冗长的故事板XAML。 – VeV 2017-11-13 23:46:11

相关问题