Pergunta sobre um perculiarity evento em um TabControl
-
03-07-2019 - |
Pergunta
Eu tenho um pouco de demonstração abaixo de um problema peculiar.
using System;
using System.Windows.Forms;
namespace WindowsApplication1
{
public class TestForm : Form
{
private System.Windows.Forms.TabControl tabControl1;
private System.Windows.Forms.TabPage tabPage1;
private System.Windows.Forms.TabPage tabPage2;
private System.Windows.Forms.TextBox textBox1;
public TestForm()
{
//Controls
this.tabControl1 = new System.Windows.Forms.TabControl();
this.tabPage1 = new System.Windows.Forms.TabPage();
this.tabPage2 = new System.Windows.Forms.TabPage();
this.textBox1 = new System.Windows.Forms.TextBox();
// tabControl1
this.tabControl1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.tabControl1.Controls.Add(this.tabPage1);
this.tabControl1.Controls.Add(this.tabPage2);
this.tabControl1.Location = new System.Drawing.Point(12, 12);
this.tabControl1.Name = "tabControl1";
this.tabControl1.SelectedIndex = 0;
this.tabControl1.Size = new System.Drawing.Size(260, 240);
this.tabControl1.TabIndex = 0;
this.tabControl1.Selected += new System.Windows.Forms.TabControlEventHandler(this.tabControl1_Selected);
// tabPage1
this.tabPage1.Controls.Add(this.textBox1);
this.tabPage1.Location = new System.Drawing.Point(4, 22);
this.tabPage1.Name = "tabPage1";
this.tabPage1.Size = new System.Drawing.Size(252, 214);
this.tabPage1.TabIndex = 0;
this.tabPage1.Text = "tabPage1";
// tabPage2
this.tabPage2.Location = new System.Drawing.Point(4, 22);
this.tabPage2.Name = "tabPage2";
this.tabPage2.Size = new System.Drawing.Size(192, 74);
this.tabPage2.TabIndex = 1;
this.tabPage2.Text = "tabPage2";
// textBox1
this.textBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.textBox1.Location = new System.Drawing.Point(6, 38);
this.textBox1.Name = "textBox1";
this.textBox1.Size = new System.Drawing.Size(240, 20);
this.textBox1.TabIndex = 0;
// TestForm
this.ClientSize = new System.Drawing.Size(284, 264);
this.Controls.Add(this.tabControl1);
this.Name = "Form1";
this.Text = "Form1";
}
//Tab Selected
private void tabControl1_Selected(object sender, EventArgs e)
{
this.Text = "TextBox Width: " + this.textBox1.Width.ToString();
}
}
//Main
static class Program
{
static void Main()
{
Application.Run(new TestForm());
}
}
}
Se você executar o código C # acima, você terá um pequeno formulário contendo uma tabcontrol. Dentro do tabcontrol é um texbox na primeira guia. Se você seguir estas etapas que você vai ver o problema:
- Selecionar TabPage2 (largura de textBox1 é relatado no título do formulário)
- Redimensionar a forma
- Selecionar TabPage1 (A largura textBox1 errado é relatado)
Todas as idéias que está acontecendo aqui? A caixa de texto é, obviamente, maior do que o que está sendo relatado. Se você clicar novamente em TabPage2 o tamanho correto é então atualizado. Obviamente, há um evento atualizando a largura da textBox1. Posso acionar isso quando TabPage1 é selecionada?
Solução
Em primeiro lugar, obrigado pelo programa completo - ele fez muito mais fácil de trabalhar para fora o que estava acontecendo
Enquanto a caixa de texto não é visível, não é redimensionada. Ao selecionar TabPage1, os incêndios evento selecionado antes os controles se tornam visíveis e caixa de texto fica estabelecidos novamente.
Agora, é por isso que está acontecendo - mas qual é a sua situação real? Se você realmente deseja capturar o tamanho dos controles de mudança, subscrever os seus eventos de redimensionamento. Se não, você poderia explicar mais sobre o que você está tentando alcançar?
Outras dicas
Eu tenho certeza que o que está acontecendo é o evento Selected
é ligeiramente levantada antes da página da guia torna-se visível. A caixa de texto não é redimensionada até que a página da guia torna-se visível, assim você acaba verificando o valor do tamanho da caixa de texto antes que ele seja realmente redimensionada. Quando você altera guias novamente, a caixa de texto já é redimensionada, de modo a obter o valor correto.
Alterar as últimas linhas do seu formulário de exemplo para se parecer com isso e ela se tornará aparente:
this.textBox1.SizeChanged += TextboxSizeChanged;
}
//Tab Selected
private void tabControl1_Selected(object sender, EventArgs e)
{
System.Diagnostics.Debug.WriteLine("tab selected");
this.Text = "TextBox Width: " + this.textBox1.Width.ToString();
}
private void TextboxSizeChanged(object sender, EventArgs e)
{
System.Diagnostics.Debug.WriteLine("Textbox resized");
}
Se você modificar seu código um pouco, adicionando um manipulador de eventos para o evento textbox1.Resize você vai ver o que acontece. O evento tabPage1.Selected ocorre antes dos controles na página de separador é redimensionado assim quando você verificar a largura da caixa de texto que está a verificar-lo antes de ser redimensionada.
Normalmente, este não seria um problema, para o redimensionamento é feito corretamente depois, mas eu acho que você vai estar usando o tamanho da caixa de texto para alguma coisa?
Você deve ser capaz de escrever o seu próprio TabControl que corrige esse problema, mas você terá que experimentar para ver o que funciona aqui.
Não tenho certeza se eu entendi o problema. Mas, você pode usar o evento de redimensionamento da caixa de texto para capturar a mudança largura ou redimensionamento do formulário.
No seu exemplo, faz o evento seleto de TabPage1 fogo quando você faz o passo 3?