我怎样才能使MarkupExtenstion在WPF 4.5按钮点击事件?能使、按钮、事件、WPF

2023-09-03 04:37:31 作者:掐指一算丶此乃大胸之罩

我要创建的MarkupExtension,为按钮的Click事件的支持。我有一篇文章previewKeyDown 此处。我想,它抛出一个异常来修改它的点击,但未能如愿。

请建议如何实现这一点。

解决方案

看起来像它试图投的MethodInfo EventInfo ,返回的目标属性可以是一个的MethodInfo EventInfo ,你将有createing委托

试试这个

 公共类电话:的MarkupExtension
    {
        公共字符串ActionName {获得;组; }
        公共电话(字符串actionName){ActionName = actionName; }

        公众覆盖对象ProvideValue(的IServiceProvider的ServiceProvider)
        {
            IProvideValueTarget targetProvider =的ServiceProvider
                .GetService(typeof运算(IProvideValueTarget))作为IProvideValueTarget;
            如果(targetProvider == NULL)
                抛出新的InvalidOperationException异常(@的CallAction扩展
                无法检索到的IProvideValueTarget服务)。

            VAR的目标= targetProvider.TargetObject为FrameworkElement的;
            如果(目标== NULL)
                抛出新的InvalidOperationException异常(@的CallAction扩展
                    只能用在FrameworkElement上)。

            如果(targetProvider.TargetProperty是MethodInfo的)
            {
                VAR targetEventAddMethod = targetProvider.TargetProperty作为MethodInfo的;
                如果(targetEventAddMethod!= NULL)
                {
                    信息参数[]标准杆= targetEventAddMethod.GetParameters();
                    键入delegateType =标准杆[1] .ParameterType;
                    MethodInfo的MethodInfo的= this.GetType()GetMethod的(MyProxyHandler,BindingFlags.NonPublic可| BindingFlags.Instance)。
                    返回Delegate.CreateDelegate(delegateType,这一点,MethodInfo的); ;
                }

            }
            否则,如果(targetProvider.TargetProperty是EventInfo)
            {
                VAR targetEventInfo = targetProvider.TargetProperty为EventInfo;
                如果(targetEventInfo!= NULL)
                {
                    键入delegateType = targetEventInfo.EventHandlerType;
                    MethodInfo的MethodInfo的= this.GetType()GetMethod的(MyProxyHandler,BindingFlags.NonPublic可| BindingFlags.Instance)。
                    返回Delegate.CreateDelegate(delegateType,这一点,MethodInfo的);
                }
            }
            返回null;
        }

        无效MyProxyHandler(对象发件人,EventArgs的)
        {
            FrameworkElement的目标=发件人的FrameworkElement的;
            如果(目标== NULL)回报;
            VAR的DataContext = target.DataContext;
            如果(DataContext的== NULL)回报;

            //获取方法,从它的名字中的datacontext
            MethodInfo的MethodInfo的= dataContext.GetType()
                .GetMethod(ActionName,BindingFlags.Public | BindingFlags.Instance);
            methodInfo.Invoke(DataContext的,NULL);
        }
    }
 

从零开始的C 自学手册 五 WPF使用GIF制作一个好看的加载等待界面

I want to create the MarkupExtension to provide support for Button click event. I have got an article for PreviewKeyDown here. I tried to modify it for Click but unable to do so as it throws an exception

Please suggest how to implement this.

解决方案

Looks like its trying to cast MethodInfo as EventInfo, the returned target property could be a MethodInfo or EventInfo you will have to check this before createing the delegate

Try this

    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);
        }
    }