如何在Winforms中控件更改高度时更新布局?

时间:2010-01-14 18:01:54

标签: c# .net winforms layout

我有一个自定义的LayoutEngine,它可以正确处理布局。但是,如果任何控件改变高度,我希望布局更新(再次调用)。

这可能吗?如果是这样,我该怎么做?在控件内部,还是布局引擎?我希望在使用此布局的任何地方都不要复制此代码。

因此,如果我可以将其封装在控件或外包装中,那将是好的。

1 个答案:

答案 0 :(得分:1)

在控件或布局容器中:

  1. 定义一个Dictionary<Control,int>,它将为每个感兴趣的控件保存一个当前高度变量。
  2. 在初始布局中:

    1. 通过感兴趣的控件(如果嵌套)或

    2. 进行递归
    3. 迭代感兴趣的控件(如果没有嵌套)

    4. ...使用“标准”迭代或递归,Linq递归或Linq“迭代”......:

      ...当您递归或迭代时,在每个控件的字典中为其当前高度创建一个条目...

      ...将一个'SizeChanged处理程序附加到在Layout Engine类中调用相同方法的每个感兴趣的控件(可能是静态方法?):为了清楚起见:让我们将其称为“事件调度代码” 。“

      在所有感兴趣的控件的事件调度代码中,现在由任何“受监控”控件上的SizeChanged事件触发:

      1. 使用Control作为键进行字典查找:获取Height属性值并与Control的当前高度值进行比较:

      2. 假设高度属性已更改:

      3. 一个。将你的布局引擎称为“做它的事情。”

        湾更新该控件的高度的标准值。

        注意:由于将使用“sender as an”对象调用SizeChanged事件:在访问其“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 ...
            }
        }