Csharp/C#教程:如何在WPF 4.5中为按钮单击事件创建MarkupExtenstion?分享


如何在WPF 4.5中为按钮单击事件创建MarkupExtenstion?

我想创建MarkupExtension以支持Button click事件。 我在这里有一篇关于PreviewKeyDown的文章。 我尝试将其修改为Click但无法执行此操作,因为它会抛出exception

请建议如何实现这一点。

看起来它试图将MethodInfoEventInfo ,返回的目标属性可能是MethodInfoEventInfo您必须在创建委托之前检查它

试试这个

上述就是C#学习教程:如何在WPF 4.5中为按钮单击事件创建MarkupExtenstion?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

  public class Call : MarkupExtension { public string ActionName { get; set; } public Call(string actionName) { ActionName = actionName; } public override object ProvideValue(IServiceProvider serviceProvider) { IProvideValueTarget targetProvider = serviceProvider .GetService(typeof(IProvideValueTarget)) as IProvideValueTarget; if (targetProvider == null) throw new InvalidOperationException(@"The CallAction extension can't retrieved the IProvideValueTarget service."); var target = targetProvider.TargetObject as FrameworkElement; if (target == null) throw new InvalidOperationException(@"The CallAction extension can only be used on a FrameworkElement."); if (targetProvider.TargetProperty is MethodInfo) { var targetEventAddMethod = targetProvider.TargetProperty as MethodInfo; if (targetEventAddMethod != null) { ParameterInfo[] pars = targetEventAddMethod.GetParameters(); Type delegateType = pars[1].ParameterType; MethodInfo methodInfo = this.GetType().GetMethod("MyProxyHandler", BindingFlags.NonPublic | BindingFlags.Instance); return Delegate.CreateDelegate(delegateType, this, methodInfo); ; } } else if (targetProvider.TargetProperty is EventInfo) { var targetEventInfo = targetProvider.TargetProperty as EventInfo; if (targetEventInfo != null) { Type delegateType = targetEventInfo.EventHandlerType; MethodInfo methodInfo = this.GetType().GetMethod("MyProxyHandler", BindingFlags.NonPublic | BindingFlags.Instance); return Delegate.CreateDelegate(delegateType, this, methodInfo); } } return null; } void MyProxyHandler(object sender, EventArgs e) { FrameworkElement target = sender as FrameworkElement; if (target == null) return; var dataContext = target.DataContext; if (dataContext == null) return; //get the method on the datacontext from its name MethodInfo methodInfo = dataContext.GetType() .GetMethod(ActionName, BindingFlags.Public | BindingFlags.Instance); methodInfo.Invoke(dataContext, null); } } 

www.ctvol.com true Article Csharp/C#教程:如何在WPF 4.5中为按钮单击事件创建MarkupExtenstion?分享

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/962373.html

(0)
上一篇 2021年11月27日 上午1:45
下一篇 2021年11月27日 上午1:48

精彩推荐