RightToLeft、ShowInTaskbarプロパティを変更すると、Form.ShowDialog()が予期せず終了します
-
02-07-2019 - |
質問
ダイアログは、閉じるボタンを押したかのように、例外なしのキャンセル結果で閉じます。
RightToLeftプロパティを設定する唯一の安全な場所は、フォームコンストラクター内です。
この情報が他の人の時間を節約するかもしれないと思いました。
問題について詳しく説明できる場合:公式のバグ確認がある場合、他にShowDialogが予期せず終了する可能性があるものを実行してください。
2番目のリンクからの引用:
2日以内に2番目のバグを見つけました。この新しいバグは非常に重大です。
RightToLeftプロパティがデフォルト値(RightToLeft = False)に設定されたNormal Formがあります。 このフォームをShow Function(Form1.Show(me))で表示しましょう
このフォームには、フォームRightToLeftを「いいえ」ではなく「はい」に変更するボタンがあります。
Private Sub Button1_Click(ByVal sender As System.Object、ByVal e As System.EventArgs)Handles Button1.Click
Me.RightToLeft = Windows.Forms.RightToLeft.Yes
サブを終了フォームは、タイトルを右側に正常に変更します。
これまでは問題ありません。
次のように問題が発生します
Show(Me)を使用して表示する代わりにShowDialog(Me)Functionを使用してこのフォームをユーザーに表示する場合次に、フォームRightToLeftを[いいえ]ではなく[はい]に変更するボタンをクリックすると、フォームは理由もなく突然閉じられ、例外もスローされません。
これが新しい問題です& .NET 3.0(Orcase)Tooにも存在します。
解決
わかりました...簡単な修正があります。それは厄介なであり、ハックですが、やや動作します。
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)で開いているフォームを閉じるときに発生するバグがありますが、修正できると確信しています!