.net 如果将RightToLeft、ShowInTaskbar属性更改为Form.ShowDialog(),则会意外结束

.net 如果将RightToLeft、ShowInTaskbar属性更改为Form.ShowDialog(),则会意外结束,.net,winforms,localization,.net,Winforms,Localization,对话框关闭时显示“取消”结果,没有异常,就像您按下了它的“关闭”按钮一样。 设置RightToLeft属性的唯一安全位置是表单构造函数 我突然想到,这些信息可能会节省其他人的时间。 如果您能够详细说明这个问题:如果有官方错误确认,还有什么可能导致ShowDialog意外结束,请执行 引用第二个链接: 我在不到两天的时间里发现了第二个bug。这个新bug非常关键 我将RightToLeft属性设置为其默认值(RightToLeft=False)的正常形式。 让我们用show函数来显示这个表单

对话框关闭时显示“取消”结果,没有异常,就像您按下了它的“关闭”按钮一样。
设置RightToLeft属性的唯一安全位置是表单构造函数

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


引用第二个链接:

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

我将RightToLeft属性设置为其默认值(RightToLeft=False)的正常形式。 让我们用show函数来显示这个表单(Form1.show(me))

此表单中有一个按钮,可将表单右侧更改为左侧为是,而不是否:

私有子按钮1\u单击(ByVal sender作为System.Object,ByVal e作为System.EventArgs)处理按钮1。单击
Me.right-toleft=Windows.Forms.right-toleft.Yes
端接头

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

到目前为止没有问题

出现如下问题

如果我们使用ShowDialog(Me)功能向用户显示此表单,而不是使用Show(Me)显示它。然后单击按钮,该按钮将表单从右到左更改为是而不是否,表单将在没有任何原因的情况下突然关闭,甚至不会抛出任何异常。
这是一个新问题,.NET3.0(Orcase)中也存在这个问题


好的。。。我有一个快速解决方案给你。这是卑鄙的,这是一种黑客行为,但它有点有效

从我对问题的回答来看:

如果您刚刚进行了从右到左的交换(_rightoleft),shneaky部分会将其附加到表单关闭事件,然后告诉它不要关闭。告诉它不要关闭,你从右到左的旗帜,让生活继续下去


*bug:关闭使用.Show打开的表单时会出现一个bug,但我相信您可以修复它

好的。。。我有一个快速解决方案给你。这是卑鄙的,这是一种黑客行为,但它有点有效

从我对问题的回答来看:

如果您刚刚进行了从右到左的交换(_rightoleft),shneaky部分会将其附加到表单关闭事件,然后告诉它不要关闭。告诉它不要关闭,你从右到左的旗帜,让生活继续下去


*bug:关闭使用.Show打开的表单时会出现一个bug,但我相信您可以修复它

刚刚用我上次设置的代码进行了测试。是的,看来你说得有道理!该死那太恶心了!刚刚用我上次设置的代码进行了测试。是的,看来你说得有道理!该死那太恶心了!它甚至可以与Show()一起工作,如果稍微修改一下:private void SetRTL(bool SetRTL){{u rightToLeft=true;ApplyRTL(SetRTL,this);\u rightToLeft=false;}它甚至可以与Show()一起工作,如果稍微修改一下:private void SetRTL(bool SetRTL){u rightToLeft=true;ApplyRTL(SetRTL,this);\u rightToLeft=false;}
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;
    }
}