簡體   English   中英

C#鎖定WinForm控件

[英]C# Lock WinForm Controls

在我編寫的程序中,用戶可以將控件添加到窗體中,並在偽設計模式下移動控件並設置一些屬性。 我希望能夠將所有這些控件按一個按鈕切換到“數據模式”時鎖定在一個位置。 我怎樣才能做到這一點? 我希望能夠遍歷所有控件並使用Lock屬性,但是我發現它沒有出現在智能感知中。

謝謝!

Locked屬性不是真正的屬性,它是Windows窗體設計器添加的屬性(例如Generate Member和Modifiers“ properties”)。 因此,您需要自己在表單級別或(如果需要)在控件級別(例如,鎖定了控件的字典)自己進行仿真,並在編寫的代碼中手動檢查它以在周圍移動控件。

鎖定控件可防止將它們拖動到設計圖面上的新大小或位置。 但是,您仍然可以通過“屬性”窗口或代碼來更改控件的大小或位置。

MSDN

我猜這是只對設計師可見的屬性。 我認為您必須實現自己的凍結機制-一個用於在“設計”和“使用”模式之間切換的小標志。

更新:似乎自定義設計器類可以根據控件是否處於設計模式來向控件添加屬性。
如果您打算采用VS建築錘式路徑,可以在這里獲得更多詳細信息。 無論如何,值得花費10分鍾的閱讀時間。
Visual Studio .NET中的自定義設計時控件功能-Dino Esposito

我以“偽設計模式”假設您確實意味着您的應用程序處於運行時狀態,並且最終用戶正在經歷“虛擬設計模式”:如果我錯了,請糾正我。

但是,我假設您指的是控件的設計時'Locked屬性,並且希望在運行時“模擬”它……對嗎?

我還假設您將鼠標上/下/移動處理程序附加到您允許移動的控件上,這可能是通過遍歷窗體(或您維護的控件集合)中的所有控件或控件的子集實現的允許移動)。

如果我的假設是正確的,那么我將在需要禁用控件移動時刪除啟用移動的事件處理程序,然后在需要允許再次移動控件時恢復那些事件處理程序。

一個主要的原因是,嚴格控制事件處理是“最佳實踐”(將事件處理程序“留在原地”可能會干擾對象處理……盡管這絕不會適用於此處的情況) )。

還有一個想法:您有一個“看不見的”面板,停靠在窗體上:該面板上的所有控件都可以移動:這可以讓您更輕松地“集中精力”關注哪些控件,您可以“花費”額外的錢代碼。 使用這種方法的缺點通常是:

  1. 如果您使用hostingForm.ActiveControl來確定哪個控件被按下(然后可以移動):您會發現某些控件(例如標簽和圖片框)在單擊時不會成為表單的活動控件,但是大多數做。

  2. 您需要考慮“ z順序”,因為不在面板中的控件封裝了您希望允許移動的偽透明面板后面的控件,這些控件將被隱藏。

出於這些原因,恕我直言,我認為禁用和重新啟用事件處理程序附件是最好,最簡單的方法,並且因為可以在控件“向下轉換”到其控件“標識”時完成:

private void enableControlsMove()
{
    foreach (Control theControl in panel1.Controls)
    {
        Console.WriteLine(theControl.Name);

        theControl.MouseDown += new MouseEventHandler(theControl_MouseDown);
        theControl.MouseUp += new MouseEventHandler(theControl_MouseUp);
        theControl.MouseMove += new MouseEventHandler(theControl_MouseMove);
    }
}

private void disableControlsMove()
{
    foreach (Control theControl in panel1.Controls)
    {
        Console.WriteLine(theControl.Name);

        theControl.MouseDown -= theControl_MouseDown;
        theControl.MouseUp -= theControl_MouseUp;
        theControl.MouseMove -= theControl_MouseMove;
    }
}

我用這種方式。

最好,比爾

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM