Richten Sie Böden von text in Steuerelementen
Den folgenden Codeausschnitt:
<Window x:Class="Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid>
<StackPanel Orientation="Horizontal"
VerticalAlignment="Center"
HorizontalAlignment="Center">
<Label Content="Name:"/>
<Label Content="Itzhak Perlman" FontSize="44"/>
</StackPanel>
</Grid>
</Window>
Macht die folgenden Schritte aus:
Gibt es eine Möglichkeit, ich kann die Bezeichnungen' Stile, so dass Ihre text-Böden ausgerichtet werden sollen?
Ich habe die gleiche Frage mit TextBlocks als gut.
BEACHTEN Sie: da ich habe gekämpft, mit diesem Thema für eine Weile, bitte poste nur, certains Antworten, die Sie wissen, dass die Arbeit.
Ich habe bereits versucht: VerticalAlignment, VerticalContentAlignment, Padding, Margin. Gibt es sonst noch etwas ich bin nicht bewusst?
Habe ich gelesen diese post, aber es muss nicht reden über ein Szenario, in der verschiedene font-size.
UPDATE: Das problem ist, dass man auch Padding auf 0 festgelegt ist, gibt es noch einen unbestimmten Raum, um die schriftart innerhalb der ContentPresenter-Bereich. in diesem Raum hängt von der Schriftgröße.
Wenn ich kontrollieren konnte, dieser Raum wäre ich in einer besseren situation.
Dank
- ah haa! Das update verdeutlicht das problem.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es keine XAML-nur Lösung, die Sie müssen, verwenden Sie code hinter. Auch mit code-behind -, es gibt keine Allgemeine Lösung für dieses, weil, was wenn der text mehrzeilig ist? Die baseline sollte verwendet werden, in diesem Fall? Oder was ist, wenn es mehrere text-Elemente in Ihre Vorlage? Wie einen header und einen Inhalt, oder mehr, die baseline dann?
Kurz gesagt, ist Ihre beste Wette ist, um den richten Sie den text manuell mit dem oberen/unteren Rand.
Wenn Sie bereit sind, um die Annahme, dass Sie einen einzelnen text-element, können Sie herausfinden, den pixel-Abstand von der Grundlinie von der Spitze des Elements durch instanziieren eines
FormattedText
Objekt mit den gleichen Eigenschaften der bereits vorhandenen text-element. DieFormattedText
Objekt hat einendouble
Baseline
Eigenschaft, die besagt, dass Wert. Beachten Sie, dass Sie immer noch manuell eingeben, eine Marge, weil das element kann nicht sitzen genau gegen den oberen oder unteren Rand des Containers.Finden Sie in diesem MSDN-forum-post: Textbox-Baseline
Hier ist eine Methode, die ich schrieb, dass Extrakte Wert. Es verwendet reflektion, um die relevanten Eigenschaften, weil Sie nicht gemeinsam zu einer einzigen Basisklasse (Sie definiert sind, die separat auf
Control
,TextBlock
,Page
,TextElement
und vielleicht auch anderen).EDIT: Hangeln, in Antwort auf Ihren Kommentar, ich glaube nicht, dass Sie tatsächlich versucht, diese Lösung, weil es funktioniert. Hier ist ein Beispiel:
Hier ist das XAML:
Und hier ist der code dahinter, die dies erreicht
Top
- Marge von sagen wir 50 abzüglich der baseline-offset, finden Sie bei uns garantiert das ausrichten auf eine bestimmte Linie egal, die Größe der schriftart.Andere Recht einfache Lösung:
1) Verwenden Sie TextBlock-Steuerelemente anstelle von Etiketten. Der Grund dafür ist, dass der TextBlock ist leichter als Label - siehe http://joshsmithonwpf.wordpress.com/2007/07/04/differences-between-label-and-textblock/
2) Verwenden Sie die LineHeight-und LineStackingStrategy = BlockLineHeight für Ihre TextBlock-style. Dies wird richten Sie die beiden auf Ihren Ausgangswert leicht.
Ich mag wirklich die kreativen Lösungen, die hier vorgestellt werden, aber ich denke, dass auf lange Sicht (Wortspiel beabsichtigt) sollten wir dieses verwenden:
Das einzige, was fehlt, im Run-element binding der Text-Eigenschaft, aber dass kann Hinzugefügt werden, früher oder später.
Einen Lauf nicht fix-die Ausrichtung der labels und deren Textfelder, aber für viele einfache situation, wird der Lauf sehr schön.
Sollte dies gut funktioniert. Experimentieren Sie mit Baseline/Bottom/Center/Top.
XAML-designer unterstützt ausrichten
TextBlock
Kontrollen, die von der baseline-zur design-Zeit:Dieser ordnet Feste Margen, um Ihre Steuerelemente. Solange die Schriftgrößen ändern sich nicht im Lauf der Zeit, die Ausrichtung wird beibehalten.
Gefunden habe ich dann tatsächlich eine einfache Antwort auf Aviad's.
Erstellte ich einen Konverter, enthält Aviad die Funktion akzeptiert das element selbst und gibt berechnete Dicke.
Dann habe ich eingerichtet,
Der Nachteil ist, dass dies offensichtlich nimmt die ursprüngliche Margin-Eigenschaft, da ein TextBlock, der nicht eine Vorlage haben, so können wir nicht setzen es per TemplateBinding.