要調用你的觸發器動作,你需要一個觸發器!
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);
}
}
}
上面是一個觸發器實現,可以調用沒有任何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);
要調用這個更容易,你可以添加一個擴展方法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);
}
}
}
現在你可以寫什麼你真的想要:
var measure = new MeasureAction();
measure.TargetObject = _mapControl;
measure.MeasureMode = MeasureAction.Mode.Polyline;
measure.MapUnits = DistanceUnit.Miles;
measure.Invoke();
它不是密封的內部地圖,但它內部的第三方圖書館。你有一些關於如何將調用者添加到派生類的示例代碼? –
啊,如果它「內部正確」(即被標記爲內部類),它就和密封一樣好......沒有從我知道的內部類派生的乾淨方法。你可能會被反射路線困住。如果是這樣的話,有很多方法可以確保Reflection的命中是一次性命中;表達式樹,Delegate.CreateDelegate,緩存返回的方法信息等。 – JerKimball
感謝迄今的答覆。如果我按照列出的方式運行它,則會出現TargetParameterCountException - 參數計數不匹配。所以我用這個語法添加了一個參數: object [] param = new object [1]; param [0] = _mapControl; var result = actionMethod。調用(measure,param); 但我仍然得到一個異常「異常已被調用的目標拋出」和(內部異常)「對象引用未設置爲對象的實例」。沒有一個對象(measure,param,param [0],_mapControl)爲空。 –