【问题标题】:How to check wether a control has been loaded?如何检查控件是否已加载?
【发布时间】:2013-05-22 06:17:57
【问题描述】:

我正在创建一个 UserControl,它有一个 SetCameraCount 方法,可以在控件实际显示之前和/或之后使用。

如果在控件显示之前使用了SetCameraCount,那么除了设置cameraCount 以便控件在第一次加载时使用它之外,什么都不应该做。

如果使用SetCameraCount 是在控件加载之后设置的,那么控件应该以与第一次加载时相同的方式更新,使用新的cameraCount 值。 p>

为此,我使用_IsLoaded 作为布尔值来检查 UserControl 是否已加载。

bool _IsLoaded;

int cameraCount;

public void SetCameraCount(int cameraCount)
{
    if (this.cameraCount != cameraCount)
    {
        this.cameraCount = cameraCount;

        if (_IsLoaded)
            buildMenu();
    }
}

void CamMultiple_Load(object sender, EventArgs e)
{
    buildMenu();
    _IsLoaded = true;
}

void buildMenu()
{
    // this method will absolutely fail if the control is not loaded
    // ...
}

我经常使用这种模式。

虽然它工作正常,但我想知道是否可以用 Windows 窗体中已经实现的某些属性替换 _IsLoaded bool。现在我什么也没找到。你知道这样的房产吗?

【问题讨论】:

  • IsHandleCreated 将匹配。顺便说一句,“构建菜单”操作没有充分的理由失败。
  • 谢谢,我会试试这个。 buildMenu 是特定的内部样板,需要构造控件,而不是 winforms 中的控件。
  • 嗯,这就是为什么 UserControl 有一个构造函数。如果您需要创建另一个类的对象,请在构造函数中执行此操作,避免使用稍后在不可预测的时间运行的事件。
  • IsHandleCreated 没问题。也似乎是 Created 属性。您是否愿意将您的评论更改为答案,以便我相信您?谢谢。
  • 我会跳过,我并不特别在意这是必要的。

标签: .net winforms user-controls


【解决方案1】:

影响其他视觉元素的 UserControl 属性值更改需要处理两种情况:

  • 之前控件可见:控件已构造,但尚未添加到控件集合中。 Load 事件尚未触发,并且控件包含的某些可视元素尚未准备好。这就是为什么必须将属性值存储在某处并用作触发控件 Load 事件的原因。

  • 控件加载后:控件使用的视觉元素已准备就绪。可以正确应用属性值更改。

这就是我使用问题中描述的模式的原因。

正如 Hans Passant 所评论的,属性 IsHandleCreated 在加载控件时变为真。 Created 属性似乎也可以工作,但我需要进一步测试它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-20
    • 2012-07-03
    • 2021-01-13
    • 2018-08-22
    • 1970-01-01
    • 2012-03-02
    • 1970-01-01
    相关资源
    最近更新 更多