c# - 以编程方式创建包含用户控件的用户控件的问题
问题描述
我创建了一个用户控件并将其添加到网格中。
BuildingBlock m_Bblock = new BuildingBlocks.BuildingBlock(2, 2);
m_grid.Children.Add(m_Bblock);
我的 BuildingBlock 的构造函数有输入和输出按钮的数量,它们都是用户控件。在构造函数内部,我有:
for (int kk = 0; kk < NumIn; ++kk)
{
InButton inbtn = new InButton();
inbtn.m_Button_Click += Button_In_Click;
InStackPanel.Children.Add(inbtn);
AllInBtn.Add(inbtn);
}
OutButton 的类似代码。
我需要有关于网格上第一个 OutButton 位置的信息,所以我使用了:
OutButton btn = m_Bblock.AllOutBtn[0];
Point pt = btn.TransformToAncestor(m_grid).Transform(new Point(0, 0));
这会导致错误(“指定的 Visual 不是此 Visual 的前身”)。我认为这是因为系统尚未“创建” OutButton,因为:
Point pt = m_Bblock.TransformToAncestor(GridDropAccept).Transform(new Point(0, 0));
工作和:
OutButton btn = m_Bblock.AllOutBtn[0];
Point pt = btn.TransformToAncestor(m_grid).Transform(new Point(0, 0));
如果我稍后调用此代码(例如,在创建事件之后通过单击按钮),则可以工作。
为什么会发生这种情况?如何刷新 OutButton 的“创建”,以便将其用于我的目的?
解决方案
为什么会发生这种情况?
因为当你的构造函数执行时,控件还没有呈现在屏幕上。这发生在稍后阶段。
您可以将代码放在Loaded
事件处理程序中,当控件准备好进行交互时将触发该事件处理程序:
this.Loaded += (s, e) =>
{
OutButton btn = m_Bblock.AllOutBtn[0];
Point pt = btn.TransformToAncestor(m_grid).Transform(new Point(0, 0));
};
推荐阅读
- docker - docker-compose up -d 不运行
- javascript - 将嵌套层次数组转换为展平对象
- reactjs - 编译失败,语法错误:缺少分号
- powerbi - 在 Power BI 上创建聚集柱形图
- kubernetes - kubeadm init 在初始化 Kubernetes 集群时失败
- ios - 与使用 AWS 移动开发工具包相关的安全风险
- c# - 使用linq json c#在字典中的两个值
- html - CSS - 背景图像在 Chrome 和 Firefox 上看起来不同
- algorithm - 我可以在 ns-3 中设置路由协议的成本吗
- c# - DateTime:自定义格式说明符