首页 > 解决方案 > 以编程方式创建包含用户控件的用户控件的问题

问题描述

我创建了一个用户控件并将其添加到网格中。

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 的“创建”,以便将其用于我的目的?

标签: c#wpf

解决方案


为什么会发生这种情况?

因为当你的构造函数执行时,控件还没有呈现在屏幕上。这发生在稍后阶段。

您可以将代码放在Loaded事件处理程序中,当控件准备好进行交互时将触发该事件处理程序:

this.Loaded += (s, e) => 
{
    OutButton btn = m_Bblock.AllOutBtn[0];
    Point pt = btn.TransformToAncestor(m_grid).Transform(new Point(0, 0));
};

推荐阅读