Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
TabPage-Text wird nicht automatisch zentriert: Workaround gesucht
ma_walter
myCSharp.de - Member



Dabei seit:
Beiträge: 8

Themenstarter:

TabPage-Text wird nicht automatisch zentriert: Workaround gesucht

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
ma_walter
myCSharp.de - Member



Dabei seit:
Beiträge: 8

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
JunkyXL
myCSharp.de - Experte

Avatar #avatar-3234.gif


Dabei seit:
Beiträge: 1.665
Herkunft: Ein paar Bytes südlich von string

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
ma_walter
myCSharp.de - Member



Dabei seit:
Beiträge: 8

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
ma_walter
myCSharp.de - Member



Dabei seit:
Beiträge: 8

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers

Moderationshinweis von herbivore (30.08.2013 - 19:18)

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.

ByteDevil
myCSharp.de - Member

Avatar #avatar-4066.png


Dabei seit:
Beiträge: 132

TabControl: TabPage.Text wird nicht zentriert.

beantworten | zitieren | melden

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:
Zitat von MSDN
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.
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
ByteDevil
myCSharp.de - Member

Avatar #avatar-4066.png


Dabei seit:
Beiträge: 132

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Programmierhans
myCSharp.de - Experte

Avatar #avatar-1651.gif


Dabei seit:
Beiträge: 4.221
Herkunft: Zentralschweiz

beantworten | zitieren | melden

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...
private Nachricht | Beiträge des Benutzers