【问题标题】:C# LocationChanged event not firingC# LocationChanged 事件未触发
【发布时间】:2015-05-20 15:32:41
【问题描述】:

我有一个表单,我用它来覆盖我不希望用户在给定时间弄乱的东西。当我使用这个覆盖表单来覆盖整个表单时,一切都很好。但是,当我使用它覆盖面板时,LocationChanged 事件永远不会触发!我尝试更改面板的属性以查看是否有某些东西以某种方式阻止它。我尝试使用 Dock = Fill,我也尝试过匹配其父控件的大小并使用锚点...均无济于事。

我是否遗漏了什么会阻止 LocationChanged 事件触发?

叠加形式:

Panel PanelToCover = new Panel();

public Overlay(Panel paneltocover)
{
    PanelToCover = paneltocover;


    this.StartPosition = FormStartPosition.Manual;
    this.AutoScaleMode = AutoScaleMode.None;
    this.Location = paneltocover.PointToScreen(Point.Empty);
    this.ClientSize = paneltocover.ClientSize;
    paneltocover.LocationChanged += PanelCover_LocationChanged;
    paneltocover.ClientSizeChanged += PanelCover_ClientSizeChanged;
    this.Show(paneltocover);
    paneltocover.Focus();
}

private void PanelCover_LocationChanged(object sender, EventArgs e)
{
    this.Location = PanelToCover.PointToScreen(Point.Empty);
}
private void PanelCover_ClientSizeChanged(object sender, EventArgs e)
{
    // This works without an issue
    this.ClientSize = PanelToCover.ClientSize;
}

编辑: 我很傻。面板相对于其所有者的位置永远不会改变。我正在检查 PointToScreen 值,观察它的变化,并想知道为什么 LocationChanged 事件从未触发。

【问题讨论】:

  • 为什么面板的位置会改变?您通常只更改表单的位置。

标签: c# winforms


【解决方案1】:

面板的位置是相对于表单的,因此如果您移动表单,则不会在面板上触发 location_changed 事件。这就是没有触发事件的原因。

【讨论】:

    【解决方案2】:

    面板的Location 属性表示面板在其包含控件(窗体)上的位置。面板不会相对于表单移动,因此LocationChanged 永远不会触发。

    【讨论】:

    • 那么这样做行得通吗? Form.LocationChanged += PanelCover_LocationChanged;
    • 是的,它可以工作。但会建议您将方法名称更改为 Form_LocationChanged 以避免将来出现歧义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多