Если вы измените свойства RightToLeft, ShowInTaskbar, Form.ShowDialog() неожиданно завершится.
-
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), но я уверен, что вы можете это исправить!