2010-01-14 64 views
0

我有一個自定義LayoutEngine,它正確處理佈局。不過,如果任何控件更改高度,我希望佈局更新(再次調用)。如何在Winforms中控件更改高度時更新佈局?

這可能嗎?如果是的話,我該怎麼做,在哪裏做?在控件內部還是佈局引擎?最好我不希望這個代碼在我使用這個佈局的地方被複制。

所以,如果我可以將它封裝在控件或內部引擎中,那將是一件好事。

回答

1

在控制或佈局容器:

  1. 限定Dictionary<Control,int>這將保持爲每個感興趣的控制電流高度可變。

在初始佈局:

  • 通過感興趣控制遞歸(如果嵌套的),或

  • 迭代通過感興趣控制(如果沒有嵌套)

  • ...使用「標準」迭代或遞歸,Linq遞歸或Linq「迭代」...:

    ...你遞歸,或迭代,使該詞典以其當前高度控制每一個條目...

    ...附上「SizeChanged將處理程序調用的每一個感興趣的控制您的佈局引擎類中的相同方法(可能是一種靜態方法?):爲了清楚起見,我們將其稱爲「事件調度代碼」。

    在事件調度代碼對所有感興趣的控制,現在有一個SizeChanged事件對你的任何「監視」控制觸發:

    1. 做字典查詢,使用控制爲關鍵:得到高度屬性值和控件的當前高度值進行比較:

    2. 假設Height屬性發生了變化:

    a。打電話給你的佈局引擎「做它的事情」。

    b。更新該控件的高度的字典值。

    注意:由於SizeChanged事件將以'sender'作爲對象進行調用:在訪問其Height屬性之前,您需要將其強制轉換爲Control類型。

    這裏的「草圖」的代碼是什麼樣子:

    // note : untested code : use caution ... test rigorously ... 
    
    // stub for the Dictionary of monitored Controls 
    private Dictionary<Control, int> LayoutManager_MonitoredControls = new Dictionary<Control, int>(); 
    
    // the SizeChanged Event Handler you "install" for all Controls you wish to monitor 
    private void LayoutManager_SizeChanged(object sender, EventArgs e) 
    { 
        Control theControl = sender as Control; 
    
        int cHeight = theControl.Height; 
    
        if (LayoutManager_MonitoredControls[theControl] != theControl.Height); 
        { 
         // update the Dictionary 
         LayoutManager_MonitoredControls[theControl] = cHeight; 
    
         // call your code to update the Layout here ... 
        } 
    } 
    
    相關問題