1

对话框以取消结果关闭,没有例外,就像您按下了关闭按钮一样。
设置 RightToLeft 属性的唯一安全位置是在表单构造函数中。

我突然想到,这些信息可能会节省其他人的时间。
如果您能够详细说明问题:如果有官方错误确认,还有什么可能导致 ShowDialog 意外结束,请做。

回复:靠近托盘 - MSDN 论坛

在运行时更改 Form RightToLeft 属性


引用第二个链接:

我在不到两天的时间内发现了第二个错误。这个新错误非常关键。

我将 Normal Form 的 RightToLeft 属性设置为默认值 ( RightToLeft=False) 。让我们用 Show Function ( Form1.Show(me) ) 来展示这个表单

在此表单中,有一个按钮将表单 RightToLeft 更改为 Yes 而不是 No:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) 处理 Button1.Click
Me.RightToLeft = Windows.Forms.RightToLeft.Yes
End Sub

表单将成功地将其标题更改为右侧。

到此为止没有问题。

问题出现如下

如果我们使用 ShowDialog(Me) 函数向用户显示此表单,而不是使用 Show(Me) 显示它。然后点击 Button 将 Form RightToLeft 更改为 Yes 而不是 No,Form 会无缘无故地突然关闭,甚至不会抛出任何异常。
这是新问题,它也存在于 .NET 3.0 (Orcase) 中。

4

1 回答 1

1

好的...我有一个快速解决方案给你。这很讨厌,这是一个黑客,但它有点工作。

从我对原始问题的回答:

private bool _rightToLeft;
private void SetRTL(bool setRTL)
{
    _rightToLeft = true;
    ApplyRTL(setRTL, this);
}

private void ApplyRTL(bool yes, Control startControl)
{
    if ((startControl is Panel) || (startControl is GroupBox))
    {
        foreach (Control control in startControl.Controls)
        {
            control.Location = CalculateRTL(control.Location, startControl.Size, control.Size);
        }
    }
    foreach (Control control in startControl.Controls)
        ApplyRTL(yes, control);
}

private Point CalculateRTL(Point currentPoint, Size parentSize, Size currentSize)
{
    return new Point(parentSize.Width - currentSize.Width - currentPoint.X, currentPoint.Y);
}

private void Form2_FormClosing(object sender, FormClosingEventArgs e)
{
    if (_rightToLeft)
    {
        _rightToLeft = false;
        e.Cancel = true;
    }
}

如果您刚刚进行了从右到左的交换(_rightToLeft) ,它会附加到表单关闭事件然后告诉它不要关闭。告诉它不要关闭后,您删除从右到左的标志并让生活继续。

*错误:关闭使用 .Show(this) 打开的表单时会出现错误,但我相信您可以修复它!

于 2008-09-30T07:48:05.140 回答