Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# IExtenderProvider和WinForms设计器文件_C#_.net_Winforms - Fatal编程技术网

C# IExtenderProvider和WinForms设计器文件

C# IExtenderProvider和WinForms设计器文件,c#,.net,winforms,C#,.net,Winforms,C#3.5 Winforms 因此,我最近发现了IExtenderProvider,以及如何使用它扩展具有附加属性的控件 在我设置的一个原型项目中,我为我的extendee属性在“set”方法上设置了一个断点,当表单加载时,我可以看到“set”方法对表单上的每个控件执行;这正是我想要的。在成功的原型之后,我将extender组件实现到我的主项目中。我的项目中的所有表单都继承自我添加了扩展程序组件的基本表单。在基本表单上,我将extender组件的修饰符设置为public,以便继承此基本表单的表单

C#3.5 Winforms

因此,我最近发现了IExtenderProvider,以及如何使用它扩展具有附加属性的控件

在我设置的一个原型项目中,我为我的extendee属性在“set”方法上设置了一个断点,当表单加载时,我可以看到“set”方法对表单上的每个控件执行;这正是我想要的。在成功的原型之后,我将extender组件实现到我的主项目中。我的项目中的所有表单都继承自我添加了扩展程序组件的基本表单。在基本表单上,我将extender组件的修饰符设置为public,以便继承此基本表单的表单可以访问它

在为extendee属性的“set”方法添加断点之前,我也做了同样的事情,但该方法不会对表单中的控件执行(只对基表单中的控件执行)。救命啊

在这一点上,我可能应该补充一点,我已经对我的表单进行了源代码控制,因此大多数表单都是签入的(即修改锁定)。对于我签出并修改了提供者属性的表单;我注意到在设计器文件中,所有控件都有一个附加语句,该语句调用provider属性的“set”方法

this.MyProvider1.SetMyProperty(this.txtTextBox1,false)

我是否正确地认为,为了让extender组件工作,它必须物理地修改设计器文件,或者它应该能够处理锁定的文件,从而动态地调用set方法?我想,如果它确实必须修改设计器文件,那么对于新表单或在将extender组件添加到项目中后被修改的表单来说,这不是一个问题,但是如果有101个表单都被源代码安全锁定,那么这将是一个问题

如果有任何想法,我将不胜感激

扩展器提供程序(IExtenderProvider)在什么时候扩展扩展器要用于的“类型”(在我的例子中是winforms控件);在设计时还是在运行时

设计器负责在属性编辑器中显示扩展器的属性
方法
boolcanextend(对象)
从IExtenderProvider接口

我是否正确地认为,为了让extender组件工作,它必须物理地修改设计器文件,或者它应该能够处理锁定的文件,从而动态地调用set方法

它必须实际修改设计器文件,并在其中写入扩展属性

我想,如果它确实必须修改设计器文件,那么对于新表单或在将extender组件添加到项目中后被修改的表单来说,这不是一个问题,但是如果有101个表单都被源代码安全锁定,那么这将是一个问题

这对于新表单来说不是问题,对于旧表单来说也不是问题
如果要设置某些扩展属性,请打开旧表单并设置扩展属性(需要签出文件)

扩展器提供程序(IExtenderProvider)在什么时候扩展扩展器要用于的“类型”(在我的例子中是winforms控件);在设计时还是在运行时

设计器负责在属性编辑器中显示扩展器的属性
方法
boolcanextend(对象)
从IExtenderProvider接口

我是否正确地认为,为了让extender组件工作,它必须物理地修改设计器文件,或者它应该能够处理锁定的文件,从而动态地调用set方法

它必须实际修改设计器文件,并在其中写入扩展属性

我想,如果它确实必须修改设计器文件,那么对于新表单或在将extender组件添加到项目中后被修改的表单来说,这不是一个问题,但是如果有101个表单都被源代码安全锁定,那么这将是一个问题

这对于新表单来说不是问题,对于旧表单来说也不是问题

如果您想设置一些扩展属性,请打开旧表单并设置扩展属性(需要签出文件)

这确实证实了我的怀疑,非常感谢。但这确实留下了一个问题,即只有对旧表单进行一些物理更改时,组件才会被扩展

我试图劫持Set property方法,以便同时向组件添加和删除事件处理程序(如果组件是控件)。Image属性是一个布尔值,当设置为false时,它会添加事件句柄,因此默认行为(设置为true不会添加事件句柄)

长话短说,作为新添加表单一部分的控件会自动添加事件处理程序,即使我没有显式地将属性设置为false,但旧表单的设计器文件从不修改,因此不会添加事件处理程序

作为背景,我试图为所有控件添加一个全局事件处理程序

这里的主题是将上下文帮助添加到我的表单这里的扩展程序示例(事件处理程序是作为最终初始化器的一部分添加的)

公共部分类帮助提供程序:组件、IExtenderProvider、ISupportInitialize

。。。扩展器的其他代码被忽略

    #region ISupportInitialize Members

    public void BeginInit()
    {
        // do nothing
    }

    public void EndInit()
    {
        if (DesignMode)
            return;

        foreach (Component item in _disableOnlineHelp)
        {
            if (item == null)
                continue;

            if (GetDisableOnlineHelp(item)) // developer has decide to set property to TRUE
                continue;

            Control control = item as Control;

            if (control != null)
                continue;

            control.HelpRequested += new HelpEventHandler(HelpProvider_HelpRequested);
            _toolTip.SetToolTip(control, GetHelpText(control));
        }
    }

    #endregion

    #region DisableOnlineHelp Provider Property

    public virtual bool GetDisableOnlineHelp(Component component)
    {
        object flag = _disableOnlineHelp[component];

        if (flag == null)
            return false;

        return (bool)flag;
    }

    public virtual void SetDisableOnlineHelp(Component component, bool value)
    {
        _disableOnlineHelp[component] = value;
    }

    #endregion

这确实证实了我的怀疑,非常感谢。但这确实留下了一个问题,即只有对旧表单进行一些物理更改时,组件才会被扩展

我试图劫持Set property方法,以便同时向组件添加和删除事件处理程序(如果组件是控件)。Image属性是一个布尔值,当设置为false时,它会添加事件句柄,因此默认行为(设置为true不会添加事件句柄)

到c
Control control = item as Control;

if (control != null)
    continue;
control.HelpRequested += new HelpEventHandle(HelpProvider_HelpRequested);
_toolTip.SetToolTip(control, GetHelpText(control));