Если вы измените свойства RightToLeft, ShowInTaskbar, Form.ShowDialog() неожиданно завершится.

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

  •  02-07-2019
  •  | 
  •  

Вопрос

Диалоговое окно закрывается с результатом «Отмена», без исключений, как если бы вы нажали кнопку закрытия.
Единственное безопасное место для установки свойства RightToLeft — это конструктор формы.

Мне пришло в голову, что эта информация может сэкономить чье-то время.
Если можно подробнее раскрыть проблему:если есть официальное подтверждение ошибки, что еще может привести к неожиданному завершению ShowDialog, пожалуйста, сделайте.

Ре:близко к трею - форумы MSDN

изменить свойство формы RightToLeft во время выполнения


Цитата из второй ссылки:

Я нашел вторую ошибку менее чем за два дня.Эта новая ошибка очень критична.

У меня есть нормальная форма со свойством RightToLeft, установленным в значение по умолчанию ( RightToLeft=False).Давайте покажем эту форму с помощью функции Show ( Form1.Show(me) ).

В этой форме есть кнопка, которая меняет форму RightToLeft на «Да» вместо «Нет»:

Частный Sub Button1_Click (отправитель ByVal As System.Object, ByVal e As System.EventArgs) Обрабатывает Button1.Click
Me.RightToLeft = Windows.Forms.RightToLeft.Да
Конец субтитра

Форма успешно изменит свой заголовок на Правую сторону.

До этого нет никаких проблем.

Проблема возникает следующим образом

Если мы отобразим эту форму пользователю с помощью функции ShowDialog(Me) вместо отображения ее с помощью Show(Me) .Затем нажмите кнопку, которая изменит форму RightToLeft на «Да» вместо «Нет», форма внезапно закроется без каких-либо причин и даже не вызовет никаких исключений.
Это новая проблема, и она существует и в .NET 3.0 (Orcase).

Это было полезно?

Решение

Хорошо...У меня есть быстрое решение для вас.Это противный, это взломать но это как бы работает.

Из моего ответа на оригинальный вопрос:

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), но я уверен, что вы можете это исправить!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top