如果更改RightToLeft,ShowInTaskbar属性,Form.ShowDialog()意外结束
-
02-07-2019 - |
题
对话框以取消结果关闭,没有异常,就像你按下了关闭按钮一样 设置RightToLeft属性的唯一安全位置是表单构造函数。
我发现这些信息可能会节省别人的时间。
如果你能够详细说明问题:如果有正式的错误确认,那么还有什么可能导致ShowDialog意外结束,请做。
从第二个链接引用:
我在不到两天的时间内发现了第二个错误。这个新bug非常关键。
我将Normal Form与RightToLeft属性设置为其默认值(RightToLeft = False)。 让我们用Show Function(Form1.Show(me))
来显示这个表单在此表单中有一个Button,它将Form 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
结束子表格会将其标题成功更改为右侧。
Up To This这没有问题。
问题发布如下
如果我们使用ShowDialog(Me)函数向用户显示此表单,而不是使用Show(Me)显示它。然后点击按钮,它将把Form RightToLeft改为Yes而不是No,Form将无理由地突然关闭,甚至不会抛出任何异常。
这是新问题&它也存在于.NET 3.0(Orcase)中。
解决方案
好的......我有一个快速解决方案。它是讨厌,它是 hack ,但它有点有效。
从我对的回答原始问题:
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)则不关闭。告诉它不要关闭你删除从右到左的旗帜,让生命继续下去。
* bug:关闭使用.Show(this)打开的表单时会出现错误,但我相信你可以修复它!