2010-05-07 98 views
20

我會盡力解釋我所追求的。我不知道它的技術術語,所以在這裏:如何在自定義控件中啓用設計支持?

示例1: 如果我在窗體上放置ListView並添加一些列,我可以在Design-Time中單擊並拖動要調整它們的列。

示例2: 現在,我在用戶控件中放置一個ListView並將其命名爲「MyCustomListView」(並且可能添加某種方法來以某種方式增強它)。

如果我知道將「MyCustomListView」放置在窗體上,我無法單擊並拖動列標題以在Design-Time中調整它們的大小。

有什麼方法可以輕鬆實現嗎?某種形式的「將點擊並拖動事件傳遞給底層控件,並讓該控件發揮其魔力」。我不是真的想重新編碼,只需傳遞鼠標點擊(或任何它),讓在這種情況下,ListView作出反應,就像它在上面的第一個例子。

回答

47

Windows窗體設計器對大多數控件都有專門的設計器類。 ListView的設計器是System.Windows.Forms.Design.ListViewDesigner,它是System.Design.dll程序集中的一個內部類。這個類可以讓你拖動列標題。

UserControl使用System.Windows.Forms.Design.ControlDesigner設計器類。它沒有做任何特別的事情,只需在拖動控制柄周圍放置一個矩形。您可以看到這是標題:將用戶控件放在窗體上後,它是用於設計類的ControlDesigner,ListViewDesigner不在圖片中。您因此失去拖動列標題的能力。另請注意,ControlDesigner不允許訪問UC內部的控件。

然而,通過創建自己的設計師可以解決這個問題。從項目+添加引用開始,選擇System.Design。您需要將公共屬性添加到UC以公開列表視圖並應用[DesignerSerializationVisibility]屬性以允許保存更改的屬性。然後將[Designer]屬性應用於UC類以替換默認設計器。這一切都應該像這(使用默認的名稱,並顯示「僱員」一個ListView):

using System; 
using System.ComponentModel; 
using System.Drawing; 
using System.Windows.Forms; 
using System.Windows.Forms.Design; // Note: add reference required: System.Design.dll 

namespace WindowsFormsApplication1 { 
    [Designer(typeof(MyDesigner))] // Note: custom designer 
    public partial class UserControl1 : UserControl { 
     public UserControl1() { 
      InitializeComponent(); 
     } 

     // Note: property added 
     [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] 
     public ListView Employees { get { return listView1; } } 
    } 

    // Note: custom designer class added 
    class MyDesigner : ControlDesigner { 
     public override void Initialize(IComponent comp) { 
      base.Initialize(comp); 
      var uc = (UserControl1)comp; 
      EnableDesignMode(uc.Employees, "Employees"); 
     } 
    } 
} 

在用戶控制列表視圖現在可以點擊並設計爲正常。

+6

++感謝您的善良。很高興你出現並教我一些東西。 – 2010-05-19 08:18:12

+4

這只是完美答案的完美例子=)Thx! – Ted 2010-05-20 01:32:48

相關問題