Laden...

TabPage-Text wird nicht automatisch zentriert: Workaround gesucht

Erstellt von ma_walter vor 16 Jahren Letzter Beitrag vor 10 Jahren 2.748 Views
M
ma_walter Themenstarter:in
8 Beiträge seit 2007
vor 16 Jahren
TabPage-Text wird nicht automatisch zentriert: Workaround gesucht

Hallo zusammen,

mir ist folgendes aufgefallen:

Ich habe ein tabControl mit fester ItemSize (SizeMode = fixed). Wenn ich den Text einer TabPage zur Laufzeit ändere, wird er nicht auf dem Reiter zentriert. Das passiert erst dann, wenn ich eine neue TabPage hinzufüge oder entferne.

Refresh() oder ähnliches hat auch nicht geholfen.

Kennt jemand das Problem bzw. eine Lösung dafür?

Besten Dank
ma_walter

M
ma_walter Themenstarter:in
8 Beiträge seit 2007
vor 16 Jahren

Hat niemand das gleiche Problem?
Ich gabe mal ein kurzes Minimalbeispiel (mit einem TabControl und drei Buttons):


private void btnSetLongText_Click(object sender, EventArgs e)
{
tabControl1.TabPages[0].Text = "abcdefghijklmnopqrstuvwxyz";
}

private void btnSetShortText_Click(object sender, EventArgs e)
{
tabControl1.TabPages[0].Text = "x";
}

private void btnAddOrRemoveTab_Click(object sender, EventArgs e)
{
if (tabControl1.TabCount > 2)
{
tabControl1.TabPages.RemoveAt(2);
}
else
{
tabControl1.TabPages.Add("page 3";);
}

Besten Dank
Markus

1.665 Beiträge seit 2006
vor 16 Jahren

Wo teilst du auch der neuen TabPage mit, dass der Header zentriert dargestellt werden soll?

Edit: Nach dem Ändern von einem TabPage Text musst du einfach nur den SizeMode neu setzen. Das heißt:

TabSizeMode sizeModeBefore = this.tabControl.SizeMode;
this.tabControl.SizeMode = TabSizeMode.Normal;
this.tabControl.SizeMode = sizeModeBefore;

und schon wird der Text neu arrangiert.

M
ma_walter Themenstarter:in
8 Beiträge seit 2007
vor 16 Jahren

Danke für den Workaraound.

Aber eine wirkliche Lösung des Problems ist das nicht. Abgesehen davon, das das TabControl bei dieser Methode einmal flackert (unschön).

Ich setze den SizeMode im Entwurfsmodus des TabControl. Der gilt für alle TabPages. Die neue TabPage hat nichts damit zu tun. Das war nur mein Workaround.

Eigentlich möchte ich wissen, wann genau das TabControl den Text zentriert und warum das beim Ändern des Textes nicht passiert, beim Hinzufügen einer anderen TabPage aber schon.

Viele Grüße
Markus

M
ma_walter Themenstarter:in
8 Beiträge seit 2007
vor 16 Jahren

Das Problem steht immer noch im Raum.

Hier gibt's doch bestimmt Experten, die das auch auch interessiert oder die eine gute Idee haben, oder?

Vielleicht sogar jemand von Microsoft, der etwas dazu sagen kann, wann der Text zentriert wird?

Viele Grüße
Markus

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo ma_walter,

das halte ich einfach für einen kleinen Bug im Framework (oder sogar schon in den vom Framework benutzen Win32-Controls). Du kannst ja mal gucken, ob der Bug schon gemeldet ist und wenn nein, ihn selber melden.

herbivore

Hinweis von herbivore vor 10 Jahren

Threads zusammengefügt.

Der Ersteller des neuen Threads hatte in seinem Beitrag zwar auf diesen Thread hier hingewiesen, sich aber für einen neuen Thread entschieden, obwohl seine Frage eine direkte Fortsetzung ist.

Hinweis entfernt.

Titel konkretisiert.

132 Beiträge seit 2013
vor 10 Jahren
TabControl: TabPage.Text wird nicht zentriert.

Hallo,

zerbrechen mir schon seit einiger Zeit den Kopf darüber, wie ich nachdem ich zur Laufzeit den tabPage.Text geändert habe, diesen auch danach zentriere. Warum das nicht automatisch passiert ist mir auch schleierhaft...

Zur eigenschaft von TabPage.Text steht in der MSDN Hilfe:

Durch Ändern des Text-Eigenschaftswerts wird der neue Wert nicht automatisch auf der Registerkarte zentriert, wenn das TabControl einen SizeMode-Eigenschaftswert von Fixed besitzt. Sie können diese Einschränkung umgehen, indem Sie die TabControl.ItemSize-Eigenschaft festlegen oder die TabPage aus der TabControl.TabPages-Auflistung entfernen und dann wieder der Auflistung hinzufügen. In beiden Fällen wird der Text automatisch zentriert.

Beide dort genannten lösungsvorschläge sind unschön weil dabei das ganze TabControl am zappeln ist...

Kennt jemand ein workaround?

Wenn nicht: gibt es eine möglichkeit neben dem Text der tabpage ein Animiertes Gif zu zeigen? Wenn ich eins über ne Imagelist hinzufüge, ist nur der erste Frame zu sehen. Bewegt sich also nix.

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo ByteDevil,

hast du schon alle Vorschläge aus [FAQ] Flackernde Controls vermeiden / Schnelles, flackerfreies Zeichnen und den verlinkten Threads probiert, um das "Zappeln" zu vermeiden?

Einfach ein animiertes Gif wird nicht gehen, aber möglicherweise kannst du per Timer die Frames selbst nach und nach in die ImageList setzen.

Oder du kannst versuchen, den Reiter selbst zu zeichnen, siehe [Tutorial] Zeichnen in Windows-Forms-Programmen (Paint/OnPaint, PictureBox). Ich glaube, irgendwo im Netz schon mal gesehen zu haben, wie man den Reiter selbst zeichnet.

herbivore

132 Beiträge seit 2013
vor 10 Jahren

Hallo herbivore,

danke für die Links 😃 DoubleBuffered habe ich schon versucht. Den rest muss ich noch ausprobieren.

Mit zappeln meine ich aber nicht nur flackern sondern ist auch der unangenehme effekt, das der Text im tabcontrol erst angezeigt und DANN zentriert wird....somit springt mein text immer von links nach rechts. Ich denke nicht, dass das ein problem ist das sich durch DoubeBuffered etc lösen lässt. Das sieht natürlich schrecklich hässlich aus.

In den TabPages befinden sich ausserdem je ein Panel das AutoScroll True hat und sehr viele Labels, Textboxen und auch einige PictureBoxen enthält. Immer wenn ich den Text der TabPage ändere "Vibriert" die Scrollbar. Keine grafikfehler oder so...sie wackelt einfach^^

Naja ich denke ich werde mal ausprobieren die Frames des Gifs zu zerlegen und wie du vorgeschlagen hast mit einer Timercomponente zu laden. Dann muss ich den Text nicht mehr ändern. Interessant zu wissen wäre natürlich trotzdem wie man dieses Problem löst.

Ich danke dir auf jedenfall sehr 😃

LG ByteDevil

4.221 Beiträge seit 2005
vor 10 Jahren

Ein einfaches RecreateHandle auf dem TabControl und schon dreht sich die Erde wieder.


            ((System.Reflection.MethodInfo)typeof(TabControl).GetMethod("RecreateHandle", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.InvokeMethod)).Invoke(this.tabControl1,null);

Gruss
Programmierhans

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...