wpf - 交互触发条件和其他适配器

标签 wpf mvvm

我需要将一些其他条件与互动触发器一起使用,例如:

作为对事件的 react ,我想执行命令,但前提是条件匹配。我也想命令会被延迟执行。我可以用那个伪xaml表达这一点。

<ci:RoutedEventTrigger Event="{x:Static Selector.SelectionChangedEvent}">
  <li:TriggerCondition ActualValue="{Binding Value}" ExpectedValue="{StaticResource foo}">
    <li:DelayAction DelayTime="{StaticResource delayTime}">
       <InvokeCommandAction CommandName="{StaticResourc commandName}"/>
    </li:DelayAction>
  </li:TriggerCondition>
</ci:RoutedEventTrigger>

我尝试编写TriggerCondition和DelayAction类,但是几乎所有的交互性代码都是内部的。

所以问题是我如何达到期望的行为?
用条件和延迟编写RoutedEventTrigger看起来不太通用,此外,我还有InputBindingTrigger等。

提前致谢

更新:
我已经使用反射完成了我想要的操作,但是我仍然在寻找您的建议以正确的方式进行操作:)
  [ContentProperty("Actions")]
  public abstract class TriggerDecorator : TriggerAction<DependencyObject>
  {
    private static readonly DependencyPropertyKey ActionsPropertyKey = 
      DependencyProperty.RegisterReadOnly("Actions", typeof (TriggerActionCollection),typeof (TriggerDecorator), new FrameworkPropertyMetadata());
    public static readonly DependencyProperty ActionsProperty = ActionsPropertyKey.DependencyProperty;
    public TriggerActionCollection Actions
    {
      get { return (TriggerActionCollection) GetValue(ActionsProperty); }
    }

    private readonly MethodInfo myTriggerAction_CallInvokeMethod;

    public TriggerDecorator()
    {
      var triggerActionType = typeof (TriggerAction);
      myTriggerAction_CallInvokeMethod = triggerActionType.GetMethod("CallInvoke", BindingFlags.Instance | BindingFlags.NonPublic);
      if(myTriggerAction_CallInvokeMethod == null)
        throw new InvalidOperationException();

      var actionCollection = (TriggerActionCollection)Activator.CreateInstance(typeof(TriggerActionCollection), true);
      SetValue(ActionsPropertyKey, actionCollection);
    }

    protected override void OnAttached()
    {
      base.OnAttached();

      if(AssociatedObject == null)
        return;
      Actions.Attach(AssociatedObject);
    }

    protected override void OnDetaching()
    {
      base.OnDetaching();
      Actions.Detach();
    }

    protected void ExecuteActions(object parameter)
    {
      var param = new[] {parameter};
      foreach (var triggerAction in Actions)
        myTriggerAction_CallInvokeMethod.Invoke(triggerAction, param);
    }
  }

最佳答案

您可以自定义EventTrigger这样的事情应该起作用:

  public sealed class DelayAction : System.Windows.Interactivity.EventTrigger
    {
        private EventArgs _eventArgs;
        private DispatcherTimer _delayTimer;

        public static readonly DependencyProperty DelayProperty =
            DependencyProperty.Register("Delay", typeof(double)
            , typeof(DelayAction), new PropertyMetadata(0.0));

        public double Delay
        {
            get { return (double)base.GetValue(DelayProperty); }
            set { base.SetValue(DelayProperty, value); }
        }

        protected override void OnDetaching()
        {
            if (_delayTimer != null)
            {
                _delayTimer.Stop();
                _delayTimer = null;
            }
            base.OnDetaching();
        }

        protected override void OnEvent(EventArgs eventArgs)
        {
            if (_delayTimer != null)
            {
                _delayTimer.Stop();
            }
            _eventArgs = eventArgs;
            _delayTimer = new DispatcherTimer();
            _delayTimer.Interval = TimeSpan.FromMilliseconds(this.Delay);
            _delayTimer.Tick += new EventHandler(TimerTick);
            _delayTimer.Start();
        }

        private void TimerTick(object sender, EventArgs e)
        {
            this._delayTimer.Stop();
            base.InvokeActions(this._eventArgs);
        }
    }
用法:
<Button Click="Button_Click">
    <i:Interaction.Triggers>
        <myTriggers:DelayAction Delay="1000" EventName="Click">
         // do stuff
        </myTriggers:DelayAction>
    </i:Interaction.Triggers>
</Button>

关于wpf - 交互触发条件和其他适配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13846065/

相关文章:

wpf - Avalondock 新标签定位和顺序

c# - 公共(public)常量字符串?

c# - 在带有 MVVM 的 DataTemplate 中使用窗口资源

c# - 如何使用 viewmodelocator 在 View 模型之间发送参数

c# - 如何从大文本中提取匹配字符串?

wpf - 使用 WPF WebBrowser 将字典传递给 ObjectForScripting

c# - 如何在包含文件的网格中显示文件上下文菜单

c# - 鼠标右键的WPF按钮命令?

wpf - 不会发生WPF MVVM TextBox更新

c# - Caliburn Micro,动态加载的 View / View 模型