【问题标题】:Coordinating messagebox or dialog location on multi-screen在多屏幕上协调消息框或对话框位置
【发布时间】:2013-04-30 12:49:55
【问题描述】:

我有主窗体 Form1(Winform) 的 App1。 Form1 启动一个非模态表单 Form2。 Form2 使用显示模式对话框 DL1 的类库 CL1。

一旦显示Form2,再显示DL1,DL1的位置就在Form2之上。

当Form2被显示,然后通过拖动改变它的位置到不同的屏幕,显示的DL1将超过Form2的原始位置(拖动前的位置)。我希望能够协调 DL1 在 Form2 上的位置,即使它移动。

我已经做了一些研究,但还没有可靠的解决方案。我希望在这里就这个问题进行讨论。

基本上 DL1 需要其父位置。由于 parent 是一个类库,DL1 可能是使用我假设的一些 Windows 算法显示的。

我尝试在关闭时保存 Form2 的位置,并且每个位置都会更改。希望在启动DL1时使用它。我认为它可能会起作用,但是您必须为每个对话框或消息框注册和维护。

顺便说一句,可能有App2和App3使用CL1。

提前致谢。

【问题讨论】:

    标签: c# winforms forms modal-dialog class-library


    【解决方案1】:

    oinBefore ShowDialog() 在 DL1 上调用,您需要将其 StartPosition 属性设置为 FormStartPosition.Manual。然后 DL1 将从您指定的位置开始。

    例如

    Form2 dlg = new Form2();
    dlg.StartPosition = FormStartPosition.Manual;
    dlg.Location = this.Location;
    dlg.ShowDialog();
    

    这将在与调用代码的表单相同的位置以模态对话框的形式启动 dlg。

    或者重载DL1中的ShowDialog函数例如:

    public void ShowDialog(Point start)
    {
        this.StartPosition = FormStartPosition.Manual;
        this.Location = start;
        this.ShowDialog();
    }
    

    【讨论】:

    • this.Location 作为类库不可用
    • 我建议您重载 ShowDialog() 方法以包含这样的起始位置 public void ShowDialog(Point start) { this.StartPosition = FormStartPosition.Manual; this.Location = start; this.ShowDialog(); }
    猜你喜欢
    • 1970-01-01
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-30
    相关资源
    最近更新 更多