Se você alterar RightToLeft, propriedades ShowInTaskBar, Form.ShowDialog () inesperadamente extremidades

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

  •  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

Re: perto de bandeja - MSDN

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 Sub

O 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 &.

Foi útil?

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

!
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top