我有一个自定义的LayoutEngine,它可以正确处理布局。但是,如果任何控件改变高度,我希望布局更新(再次调用)。
这可能吗?如果是这样,我该怎么做?在控件内部,还是布局引擎?我希望在使用此布局的任何地方都不要复制此代码。
因此,如果我可以将其封装在控件或外包装中,那将是好的。
答案 0 :(得分:1)
在控件或布局容器中:
Dictionary<Control,int>
,它将为每个感兴趣的控件保存一个当前高度变量。在初始布局中:
通过感兴趣的控件(如果嵌套)或
迭代感兴趣的控件(如果没有嵌套)
...使用“标准”迭代或递归,Linq递归或Linq“迭代”......:
...当您递归或迭代时,在每个控件的字典中为其当前高度创建一个条目...
...将一个'SizeChanged处理程序附加到在Layout Engine类中调用相同方法的每个感兴趣的控件(可能是静态方法?):为了清楚起见:让我们将其称为“事件调度代码” 。“
在所有感兴趣的控件的事件调度代码中,现在由任何“受监控”控件上的SizeChanged事件触发:
使用Control作为键进行字典查找:获取Height属性值并与Control的当前高度值进行比较:
假设高度属性已更改:
一个。将你的布局引擎称为“做它的事情。”
湾更新该控件的高度的标准值。
注意:由于将使用“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 ...
}
}