【问题标题】:C# Winform panel Shown eventC# Winform 面板显示事件
【发布时间】:2016-11-30 13:57:32
【问题描述】:

是否存在与表单事件显示等效的面板事件? 我在一个永远不会关闭的表单中进行了几次面板切换。 但是,我找不到任何与表单中使用的 Shown 之类的事件相近的东西。 我的关闭是 Paint 事件。但是我只希望每次显示面板时更新一次。

【问题讨论】:

  • Form.Shown 在表单第一次显示时引发。它永远不会再被提升。因此,对于任意控件,您可以使用 HandleCreated 之类的东西,覆盖 OnCreateControl() 方法来添加您的代码。但是,听起来您认为 Form.Shown 的工作方式与实际工作方式略有不同......
  • 您如何展示面板?提供一些代码会有所帮助。
  • 焦点事件有什么问题?是否显示失焦?
  • 试试Layout 是否符合您的要求..

标签: c# winforms


【解决方案1】:

Form.Shown 不是在每次显示表单时都出现,而是 Occurs whenever the form is first displayed。话虽如此,没有Panel.Shown 事件,也没有“每当面板首次显示时”引发的事件。

您可以使用Panel.Paint 事件模拟此行为,使用标志来跟踪它之前是否“显示”过一次。这将使它的行为类似于Form.Shown。

private bool panel1Painted = false;
private void panel1_Paint(object sender, PaintEventArgs e)
{
    if (!panel1Painted)
    {
        // do your shown stuff here
        panel1Painted = true;
    }
}

为了保持Form.Shown 的精神,如果面板被重建,您可能需要重置标志。这与显示的不同。

【讨论】:

  • 由于面板本身没有被破坏,并且可能存在同一面板的另一个实例,因此更改面板1可能不会随后反映在同一实例的面板2中。
  • 为每个面板使用不同的标志。我认为这很明显。
  • @CodyGray "Paint 事件被触发了一个 lot" 是一个不真实的陈述(好吧,我猜这取决于你对 lot 的定义. 每次显示面板时,是 lot 吗?)。也许您可以对其进行测试并报告您的发现。加上if (!panel1Painted) 在显示面板时评估成本不是很高。也许你也可以测试一下?
  • @CodyGray 你有机会测试它吗?请发布您的发现
【解决方案2】:

您可以监听 VisibleChanged 事件,并且仅在可见性 = true 时采取行动。

https://msdn.microsoft.com/en-us/library/system.windows.forms.panel_events%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396

您还可以试验Enter 和Invalidated 事件,看看它们是否能给您想要的结果。

或者,如果在离开时禁用面板是一个选项,您可以在工具箱中使用EnabledChanged 事件。

【讨论】:

  • 在我的情况下,可见总是正确的。我有一个主面板作为子面板的容器,在运行期间,主面板的控制被清除并添加了子面板。卸载时子面板不会被破坏。
猜你喜欢
  • 2018-06-19
  • 2020-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-15
  • 1970-01-01
相关资源
最近更新 更多