2010-01-14 63 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 ... 
        } 
    } 
    
    相关问题