RightToLeft、ShowInTaskbarプロパティを変更すると、Form.ShowDialog()が予期せず終了します

StackOverflow https://stackoverflow.com/questions/152069

  •  02-07-2019
  •  | 
  •  

質問

ダイアログは、閉じるボタンを押したかのように、例外なしのキャンセル結果で閉じます。
RightToLeftプロパティを設定する唯一の安全な場所は、フォームコンストラクター内です。

この情報が他の人の時間を節約するかもしれないと思いました。
問題について詳しく説明できる場合:公式のバグ確認がある場合、他にShowDialogが予期せず終了する可能性があるものを実行してください。

Re:トレイの近く-MSDNフォーラム

実行時にフォームRightToLeftプロパティを変更


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)で開いているフォームを閉じるときに発生するバグがありますが、修正できると確信しています!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top