Se você alterar RightToLeft, propriedades ShowInTaskBar, Form.ShowDialog () inesperadamente extremidades
-
02-07-2019 - |
Pergunta
diálogo fecha com Anular resultado, há exceções, como se você tivesse pressionado o respectivo botão de perto.
O único lugar seguro para definir a propriedade RightToLeft é no construtor formulário.
Ocorreu-me que esta informação pode economizar tempo de outra pessoa.
Se você é capaz de elaborar sobre a questão:. Se há uma confirmação bug oficial, o que poderia outra causa ShowDialog para terminar de forma inesperada, por favor, faça
mudar de forma RightToLeft propriedade em tempo de execução
Citar a partir do segundo link:
Eu encontrei um segundo bug em menos de dois dias. Este novo bug é muito crítico.
Eu tenho forma normal com RightToLeft conjunto de propriedades para seu valor padrão (RightToLeft = False). Vamos mostrar esta forma com Show Function (Form1.Show (me))
Neste formulário existe um botão que mudar de forma RightToLeft como Sim, em vez de Não:
Private Sub Button1_Click (remetente ByVal Como System.Object, e ByVal As System.EventArgs) Handles Button1.Click
Me.RightToLeft = Windows.Forms.RightToLeft.Yes
End SubO formulário irá alterar o seu título com sucesso a Lado Direito.
Até este não há nenhum problema.
Problema occure da seguinte forma
Se nós Mostrar esta formulário para o usuário usando ShowDialog Function (Me) em vez de exibi-lo usando Show (Me). Clique no botão que irá mudar de forma RightToLeft como Sim, em vez de Não, formulário irá fechar De repente, sem razões, e até mesmo não lançar quaisquer exceções.
Esta é a nova existem também está em .NET 3.0 (Orcase) Demasiado problema &.
Solução
Ok ... Eu tenho uma solução rápida para você. É desagradável , é um corte , mas tipo obras.
De minha resposta à originais questão :
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;
}
}
A parte shneaky-lo para anexar ao evento de encerramento formulário e, em seguida, dizer-lhe para não fechar se você tiver apenas realizou um direito de permuta esquerdo (_rightToLeft). Tendo dito que não perto de remover o direito de bandeira esquerda e deixar a vida continuar.
* bug: há um bug que ocorre quando fechar uma forma aberta com .Show (this), mas eu tenho certeza que você pode corrigir isso
!