2009-04-24 42 views
1

C#3.5的WinForms ...IExtenderProvider和WinForms設計文件

所以,我最近發現的IExtenderProvider,以及它如何被用來與其他屬性管制範圍擴大。

在工程樣機,我安裝我穿上「設置」方法的突破點我extendee財產和形式的負荷,我可以看到的「設置」方法爲表單上的每個控件執行;這正是我想要的。在成功的原型之後,我在我的主項目中實現了擴展器組件。我的項目中的所有表單都從我添加了擴展器組件的基本表單繼承。在基本形式上,我將擴展器組件的修飾符設置爲public,以便可以通過繼承此基本形式的表單訪問它。

在爲我的extendee屬性的'set'方法添加一個斷點之前做同樣的事情,但該方法不執行表單中的控件(但僅限於基本窗體中的控件)。幫幫我!

我也許應該補充在這一點上,我已經源來控制我的形式,因此大部分都是簽入(即從修改鎖)。對於我檢出並修改提供程序屬性的表單;我在設計器文件中注意到所有控件都有一個額外的聲明,它調用了provider屬性的'set'方法。

this.MyProvider1.SetMyProperty(this.txtTextBox1,FALSE);

我是否認爲擴展器組件工作時必​​須物理修改設計器文件,還是應該能夠處理鎖定的文件,並因此動態調用set方法?我想如果它確實需要修改設計器文件,那麼對於在將擴展器組件添加到項目後得到修改的新窗體或窗體,這不是問題 - 但是當你有101個窗體全部被源鎖定時-safe ...

我會很感激的任何想法...

回答

1

在什麼時候該擴展程序提供程序(IExtenderProvider)延長「類型」(在我的情況一個WinForms控件)擴展器是爲了;在設計時還是在運行時?

設計師負責顯示你從IExtenderProvider接口

屬性編輯器
方法bool CanExtend(object)延伸器的性能我是正確的思維,對於擴展器組件工作它必須物理修改設計器文件,或者它應該能夠處理鎖定的文件,因此動態調用set方法?

它在物理上修改設計文件,並寫入擴展屬性有

我想,如果它確實有修改設計文件,那麼這是不是一個問題在將擴展器組件添加到項目後得到修改的新表單或表單 - 但是,如果您有101個表單全部被源安全鎖定,則會出現問題。

這是不是新形式的問題,並不是舊形式
如果你想設置一些擴展屬性,打開舊窗體並設置擴展屬性(檢出文件是必要的)

0

這確實確實證實了我的懷疑,非常感謝。但是這確實會留下一個問題,即只有在對舊窗體進行了一些物理更改時纔會擴展這些組件。

我試圖劫持Set屬性方法來添加和刪除組件的事件處理程序(如果組件是一個控件)。圖像的屬性是一個布爾值,當設置爲false時,它添加事件句柄並因此添加默認行爲(設置爲true不會添加事件處理函數)

將長話短說的控件屬於新添加的表單會自動添加一個事件處理程序,即使沒有我明確地將該屬性設置爲false,但舊錶單的設計器文件也不會修改,因此不會添加事件處理程序。

由於一些背景,我是想添加一個全局事件處理程序對所有的控制 Global event handler for all controls for User Help

這裏的主題是上下文幫助添加到我的形式在此示例中的擴展器(事件處理程序被添加爲一部分結束初始化劑)

公共部分類HelpProvider的:組件,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 
0

一個問題可能是foreach循環中EndInit方法:

Control control = item as Control; 

if (control != null) 
    continue; 

如果該項目,事實上,一個控制,你執行這段代碼之前走出循環:

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

所以你永遠不會將事件處理程序或工具提示添加到任何控件。哎呀:)

謝謝, 約翰