1

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

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

Re: トレイに近い - MSDN フォーラム

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


2番目のリンクからの引用:

2 日も経たないうちに 2 つ目のバグを発見しました。この新しいバグは非常に重大です。

RightToLeft プロパティがデフォルト値 ( RightToLeft=False) に設定された標準フォームがあります。このフォームを Show Function ( Form1.Show(me) ) で表示してみましょう。

このフォームには、フォームの RightToLeft を No ではなく Yes に変更する Button があります。

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

フォームのタイトルが正常に右側に変更されます。

ここまでは問題ありません。

次のように問題が発生します

Show(Me) を使用して表示する代わりに、 ShowDialog(Me) 関数を使用してこのフォームをユーザーに表示するとします。次に、Form RightToLeft を No ではなく Yes に変更するボタンをクリックすると、フォームは理由もなく突然閉じられ、例外もスローされません。
これは新しい問題であり、.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 に答える