以编程方式调用WPF TargetedTriggerAction

Kei*_*h G 4 c# wpf action eventtrigger routed-events

我有来自第三方库的TargetedTriggerAction,它想要调用/调用而不将其附加到按钮.我没有问题让它与按钮一起工作,但我想这样做是为了响应一些非UI事件.

这是动作的类声明:

 public class MeasureAction : TargetedTriggerAction<Map>
Run Code Online (Sandbox Code Playgroud)

这是我到目前为止的设置代码:

    var measure = new MeasureAction();
    measure.TargetObject = _mapControl;
    measure.MeasureMode = MeasureAction.Mode.Polyline;
    measure.MapUnits = DistanceUnit.Miles;
Run Code Online (Sandbox Code Playgroud)

我希望能够做这样的事情,但我知道Invoke受到保护:

measure.Invoke();
Run Code Online (Sandbox Code Playgroud)

Oll*_*lly 8

要调用触发器操作,您需要一个触发器!

namespace TriggerTest
{
    using System.Windows;

    /// <summary>
    /// A trigger that may be invoked from code.
    /// </summary>
    public class ManualTrigger : System.Windows.Interactivity.TriggerBase<DependencyObject>
    {
        /// <summary>
        /// Invokes the trigger's actions.
        /// </summary>
        /// <param name="parameter">The parameter value.</param>
        public void Invoke(object parameter)
        {
            this.InvokeActions(parameter);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

以上是可以在没有任何UI依赖性的情况下调用的触发器实现.例如:

var measure = new MeasureAction();
measure.TargetObject = _mapControl;
measure.MeasureMode = MeasureAction.Mode.Polyline;
measure.MapUnits = DistanceUnit.Miles; 

ManualTrigger trigger = new ManualTrigger();
trigger.Actions.Add(measure);
trigger.Invoke(null);
Run Code Online (Sandbox Code Playgroud)

为了使调用这个更容易,你可以添加一个扩展方法TriggerAction.

namespace TriggerTest
{
    using System.Windows.Interactivity;

    /// <summary>
    /// Allows a trigger action to be invoked from code.
    /// </summary>
    public static class TriggerActionExtensions
    {
        /// <summary>
        /// Invokes a <see cref="TriggerAction"/> with the specified parameter.
        /// </summary>
        /// <param name="action">The <see cref="TriggerAction"/>.</param>
        /// <param name="parameter">The parameter value.</param>
        public static void Invoke(this TriggerAction action, object parameter)
        {
            ManualTrigger trigger = new ManualTrigger();
            trigger.Actions.Add(action);

            try
            {
                trigger.Invoke(parameter);
            }
            finally
            {
                trigger.Actions.Remove(action);
            }
        }

        /// <summary>
        /// Invokes a <see cref="TriggerAction"/>.
        /// </summary>
        /// <param name="action">The <see cref="TriggerAction"/>.</param>
        public static void Invoke(this TriggerAction action)
        {
            action.Invoke(null);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在你可以写出你真正想要的东西了:

var measure = new MeasureAction();
measure.TargetObject = _mapControl;
measure.MeasureMode = MeasureAction.Mode.Polyline;
measure.MapUnits = DistanceUnit.Miles; 
measure.Invoke();
Run Code Online (Sandbox Code Playgroud)