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)
要调用触发器操作,您需要一个触发器!
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)
| 归档时间: |
|
| 查看次数: |
2410 次 |
| 最近记录: |