WPF TextBlock में टेक्स्ट वर्टिकल अलाइनमेंट


228

मैं टेक्स्टबॉक के अंदर पाठ को ऊर्ध्वाधर केंद्र संरेखण कैसे निर्दिष्ट करूं? मुझे TextAlignment संपत्ति मिली, लेकिन यह क्षैतिज पाठ संरेखण के लिए है। मैं इसे ऊर्ध्वाधर पाठ संरेखण के लिए कैसे करूँ?


@shr और अन्य: ध्यान दें कि TextAlignmentकेवल क्षैतिज संरेखण को प्रभावित करता है, न कि ऊर्ध्वाधर संरेखण को (जैसा कि प्रश्न संदर्भित करता है)।
ड्रू नोक

जवाबों:


284

एक टेक्स्टब्लॉक स्वयं ऊर्ध्वाधर संरेखण नहीं कर सकता है

ऐसा करने का सबसे अच्छा तरीका है कि मैंने पाया है कि टेक्स्टब्लॉक को एक सीमा के अंदर रखना है, इसलिए सीमा आपके लिए संरेखण करती है।

<Border BorderBrush="{x:Null}" Height="50">
    <TextBlock TextWrapping="Wrap" Text="Some Text" VerticalAlignment="Center"/>
</Border>

नोट: यह कार्यात्मक रूप से एक ग्रिड का उपयोग करने के बराबर है, यह सिर्फ इस बात पर निर्भर करता है कि आप अपने बाकी लेआउट के साथ कैसे फिट होना चाहते हैं जिसके लिए एक अधिक उपयुक्त है


22
+1 सीमा की ऊँचाई को कार्यक्षेत्र संरेखण के लिए निर्धारित किया जाना चाहिए।
टिम लॉयड

21
इसके अलावा, TextBlock में एक ऊंचाई निर्दिष्ट नहीं हो सकती है, या यह लंबवत रूप से केंद्र में नहीं होगी।
pearcewg

20
@gav - TextAlignment केवल क्षैतिज संरेखण करता है ... प्रश्न ऊर्ध्वाधर संरेखण के बारे में है
ओरियन एडवर्ड्स

@TimLloyd - मुझे यकीन नहीं है कि यह हमेशा सच है। मुझे यह सेट-अप मिल गया है, सीमा की ऊंचाई "ऑटो" है और यह ठीक काम कर रही है। यह तारांकित पंक्ति हाइट्स (और पंक्ति में अन्य चीजें) के साथ एक ग्रिड सेल में है।
बॉब सेमर

97

जबकि ओरियन एडवर्ड्स उत्तर किसी भी स्थिति के लिए काम करता है, यह सीमा को जोड़ने और हर बार जब आप ऐसा करना चाहते हैं तो सीमा के गुणों को सेट करने के लिए दर्द हो सकता है। पाठ ब्लॉक की पैडिंग सेट करने के लिए एक और त्वरित तरीका है:

<TextBlock Height="22" Padding="3" />

11
मुझे लगता है कि यह सबसे शानदार जवाब है।
बोपिटी बोप

1
यह केवल तभी काम करता है जब फ़ॉन्ट में 16px का आकार न हो !?
C4d

1
स्वीकृत उत्तर टेक्स्टबॉक्स की वास्तविक सीमाओं को सही ढंग से लंबवत रूप से संरेखित करेगा, लेकिन यह वास्तविक पाठ पर कोई प्रभाव नहीं डालता है ... जो मुझे यकीन है कि ओपी का इरादा है। यह समाधान एक उचित TextVerticalAlignment संपत्ति के बदले में काम करता है और मेरा उत्थान प्राप्त करता है। :)
ट्रेकी

ब्लॉक के भीतर गतिशील सामग्री के बारे में क्या, 2 या 5 लाइनों को अलग-अलग पैडिंग की आवश्यकता नहीं होगी, 10pt बनाम 24pt फोंट
Reahreic

57

TextBlock ऊर्ध्वाधर पाठ संरेखण का समर्थन नहीं करता है।

मैं इसके चारों ओर टेक्स्ट ब्लॉक को ग्रिड के साथ लपेटकर और क्षैतिज क्षैतिजता = "स्ट्रेच" और वर्टिकल-एलाइनमेंट = "केंद्र" सेट करके काम करता हूं।

ऐशे ही:

<Grid>
    <TextBlock 
        HorizontalAlignment="Stretch"
        VerticalAlignment="Center"
        Text="Your text" />
</Grid>

+1 को सीमा-आधारित दृष्टिकोण के साथ, ग्रिड के लिए ऊंचाई निर्धारित करने की आवश्यकता नहीं है।
इफरान कोबिसी

मैंने पाया कि यह दृष्टिकोण मेरे लिए सबसे अच्छा काम करता है। मैं ओवरले करके गतिशील सूचक रोशनी बनाने रहा हूँ TextBlockपर Ellipseएक के अंदर Grid। मेरी चौड़ाई और ऊंचाई के गुणों को बांधने या कुछ भी मुश्किल करने की आवश्यकता नहीं है।
धान

17

आप टेक्स्टब्लॉक के बजाय लेबल का उपयोग कर सकते हैं।

<Label Content="Hello, World!">
    <Label.LayoutTransform>
        <RotateTransform Angle="270"/>
    </Label.LayoutTransform>
</Label>

3
अच्छा, लेबल में वर्टिकल कॉन्टेंटअलिग्मेंट है। Greeeat। +1
इग्नासियो सोलर गार्सिया

3
स्पष्ट नहीं है कि ओपी को टेक्स्टब्लॉक का उपयोग करने की आवश्यकता है या लेबल के साथ दूर हो सकता है। एक लेबल का उपयोग करने के लिए मुझे जो चाहिए वह काम किया। +1
स्टीव कलामेक्विज़ 17

19
यह प्रश्न का उत्तर देता है कि ऊर्ध्वाधर पाठ का उत्पादन कैसे करें, ऊर्ध्वाधर संरेखण कैसे लागू करें!
सेबस्टियन नेग्रास्ज़स

26
इस सवाल पर मेटा पर चर्चा की जा रही है: meta.stackoverflow.com/questions/305572/…
NathanOliver

6

यदि आप पाठ रैपिंग के बिना कर सकते हैं , तो मुझे लगता है कि एक लेबल के साथ TextBlock की जगह ऐसा करने का सबसे रसीला तरीका है। अन्यथा अन्य मान्य उत्तरों में से एक का पालन करें।

<Label Content="Some Text" VerticalAlignment="Center"/>

6

TextBlockअपनी सामग्री के ऊर्ध्वाधर संरेखण का समर्थन नहीं करता है। यदि आप उपयोग करना चाहते हैं TextBlockतो आपको इसके अभिभावक के साथ इसे संरेखित करना होगा।

हालाँकि यदि आप Labelइसके बजाय उपयोग कर सकते हैं (और उनके पास समान कार्यक्षमता है) तो आप पाठ सामग्री को रख सकते हैं :

<Label VerticalContentAlignment="Center" HorizontalContentAlignment="Center">
   I am centred text!
</Label>

Labelडिफ़ॉल्ट रूप से अपनी सीमा को भरने के लिए खिंचाव, जिसका अर्थ है लेबल के पाठ केंद्रित किया जाएगा।


3

मेरे लिए, VerticalAlignment="Center"इस समस्या को ठीक करता है।
यह हो सकता है क्योंकि TextBlockएक ग्रिड में लिपटे हुए है, लेकिन फिर wpf में व्यावहारिक रूप से सब कुछ है।


1

मैंने पाया है कि टेक्स्टबॉक्स शैली (यानी controltemplate:) को संशोधित करना और फिर PART_ContentHostकेंद्र के लिए ऊर्ध्वाधर संरेखण को संशोधित करना चाल होगा


OP TextBlocks के बारे में पूछ रहा है। उनके पास ControlTemplates नहीं है।
ऐव्स

1

बस गिगल्स के लिए, इस एक्सएएमएल को एक चक्कर दें। यह सही नहीं है क्योंकि यह एक 'संरेखण' नहीं है, लेकिन यह आपको एक अनुच्छेद के भीतर पाठ संरेखण को समायोजित करने की अनुमति देता है।

<TextBlock>
    <TextBlock BaselineOffset="30">One</TextBlock>
    <TextBlock BaselineOffset="20">Two</TextBlock>  
    <Run>Three</Run>            
    <Run BaselineAlignment="Subscript">Four</Run>   
</TextBlock>

1

यदि आप TextBlock की ऊँचाई को अनदेखा कर सकते हैं, तो आपके लिए इसका उपयोग करना बेहतर होगा:

<TextBlock Height="{Binding}" Text="Your text"
TextWrapping="Wrap" VerticalAlignment="Center" Width="28"/>

1

मेरे मामले में, मैंने TextBlockडिस्प्ले को अच्छा बनाने के लिए ऐसा किया ।

<Border BorderThickness="3" BorderBrush="Yellow" CornerRadius="10" Padding="2"
    HorizontalAlignment="Center" VerticalAlignment="Center" Height="30" Width="150">
        <TextBlock FontSize="20" Height="23" HorizontalAlignment="Left" Margin="0,0,0,-5" Text="" VerticalAlignment="Top" Width="141" Background="White" />
</Border>

टेक्स्ट को नीचे से आगे करने की ट्रिक सेट करनी है

Margin="0,0,0,-5"

0

आप मेरी ब्लॉग पोस्ट देख सकते हैं। आप codebehind से Textblock की कस्टम ऊंचाई सेट कर सकते हैं। कस्टम ऊंचाई सेट करने के लिए आपको इसे एक सीमा या स्टैकपैन के अंदर स्थापित करने की आवश्यकता है

http://ciintelligence.blogspot.com/2011/02/wpf-textblock-vertical-alignment-with.html


0

मैंने पाया कि मुझे इसे थोड़ा अलग करना था। मेरी समस्या यह थी कि यदि मैंने फ़ॉन्ट आकार को बदल दिया, तो पाठ पंक्ति के बाकी टेक्स्टबॉक्स के साथ नीचे की ओर बने रहने के बजाय टेक्स्टबॉक्स में ऊपर चला जाएगा। ऊपर से नीचे की ओर लंबवत संरेखण को बदलकर मैं फ़ॉन्ट को प्रोग्राम 20 से आकार 14 और वापस आकार में बदलने में सक्षम था, पाठ के गुरुत्वाकर्षण को नीचे और चीजों को साफ-सुथरा रखने पर। ऐसे:

यहां छवि विवरण दर्ज करें


0

लंबवत रूप से सिंगल लाइन टेक्स्टबॉक्स को संरेखित करें।

@ ओरियन एडवर्ड्स द्वारा दिए गए उत्तर पर विस्तार करने के लिए, यह है कि आप कोड-पीछे (कोई भी शैली सेट) से पूरी तरह से कैसे करेंगे। मूल रूप से एक कस्टम वर्ग बनाते हैं जो बॉर्डर से विरासत में मिला है, जिसमें उसका चाइल्ड टेक्स्टबॉक्स है। नीचे दिए गए उदाहरण में माना गया है कि आप केवल एक ही लाइन चाहते हैं और यह कि सीमा एक कैनवस का बच्चा है। यह भी मानता है कि आपको बॉर्डर की चौड़ाई के आधार पर टेक्स्टबॉक्स की मैक्सलेंथ प्रॉपर्टी को समायोजित करने की आवश्यकता होगी। नीचे दिया गया उदाहरण बॉर्डर के कर्सर को एक टेक्स्टबॉक्स की नकल करने के लिए 'IBeam' प्रकार पर सेट करता है। '3' का एक मार्जिन सेट किया गया है ताकि टेक्स्टबॉक्स सीमा के बाईं ओर बिल्कुल संरेखित न हो।

double __dX = 20;
double __dY = 180;
double __dW = 500;
double __dH = 40;
int __iMaxLen = 100;

this.m_Z3r0_TextBox_Description = new CZ3r0_TextBox(__dX, __dY, __dW, __dH, __iMaxLen, TextAlignment.Left);
this.Children.Add(this.m_Z3r0_TextBox_Description);

वर्ग:

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Shapes;
using System.Windows.Controls.Primitives;


namespace ifn0tz3r0Exp
{
    class CZ3r0_TextBox : Border
    {
        private TextBox m_TextBox;

        private SolidColorBrush m_Brush_Green = new SolidColorBrush(Colors.MediumSpringGreen);
        private SolidColorBrush m_Brush_Black = new SolidColorBrush(Colors.Black);
        private SolidColorBrush m_Brush_Transparent = new SolidColorBrush(Colors.Transparent);

        public CZ3r0_TextBox(double _dX, double _dY, double _dW, double _dH, int _iMaxLen, TextAlignment _Align)
        {

            /////////////////////////////////////////////////////////////
            //TEXTBOX
            this.m_TextBox = new TextBox();
            this.m_TextBox.Text = "This is a vertically centered one-line textbox embedded in a border...";
            Canvas.SetLeft(this, _dX);
            Canvas.SetTop(this, _dY);
            this.m_TextBox.FontFamily = new FontFamily("Consolas");
            this.m_TextBox.FontSize = 11;
            this.m_TextBox.Background = this.m_Brush_Black;
            this.m_TextBox.Foreground = this.m_Brush_Green;
            this.m_TextBox.BorderBrush = this.m_Brush_Transparent;
            this.m_TextBox.BorderThickness = new Thickness(0.0);
            this.m_TextBox.Width = _dW;
            this.m_TextBox.MaxLength = _iMaxLen;
            this.m_TextBox.TextAlignment = _Align;
            this.m_TextBox.VerticalAlignment = System.Windows.VerticalAlignment.Center;
            this.m_TextBox.FocusVisualStyle = null;
            this.m_TextBox.Margin = new Thickness(3.0);
            this.m_TextBox.CaretBrush = this.m_Brush_Green;
            this.m_TextBox.SelectionBrush = this.m_Brush_Green;
            this.m_TextBox.SelectionOpacity = 0.3;

            this.m_TextBox.GotFocus += this.CZ3r0_TextBox_GotFocus;
            this.m_TextBox.LostFocus += this.CZ3r0_TextBox_LostFocus;
            /////////////////////////////////////////////////////////////
            //BORDER

            this.BorderBrush = this.m_Brush_Transparent;
            this.BorderThickness = new Thickness(1.0);
            this.Background = this.m_Brush_Black;            
            this.Height = _dH;
            this.Child = this.m_TextBox;
            this.FocusVisualStyle = null;
            this.MouseDown += this.CZ3r0_TextBox_MouseDown;
            this.Cursor = Cursors.IBeam;
            /////////////////////////////////////////////////////////////
        }
        private void CZ3r0_TextBox_MouseDown(object _Sender, MouseEventArgs e)
        {
            this.m_TextBox.Focus();
        }
        private void CZ3r0_TextBox_GotFocus(object _Sender, RoutedEventArgs e)
        {
            this.BorderBrush = this.m_Brush_Green;
        }
        private void CZ3r0_TextBox_LostFocus(object _Sender, RoutedEventArgs e)
        {
            this.BorderBrush = this.m_Brush_Transparent;
        }
    }
}

0

मुझे लगता है कि लेबल में एक लेबल (या टेक्स्टब्लॉक) का उपयोग करना बेहतर है, आप सीधे सीमा नियंत्रण में एक माउस घटना को संलग्न नहीं कर सकते, आखिरकार यह टेक्स्टब्लॉक में संलग्न है, यह मेरा पुनर्संस्थापन है:

<Label 
    Height="32"
    VerticalContentAlignment="Center"
    HorizontalContentAlignment="Stretch"
    MouseLeftButtonUp="MenuItem_MouseLeftButtonUp">
    <TextBlock Padding="32 0 10 0">
        Label with click event
    </TextBlock>
</Label>

0

मुझे लगता है कि बिना किसी बॉर्डर और बैकग्राउंड वाले टेक्स्टबॉक्स का इस्तेमाल करना एक आसान और तेज़ तरीका है, जो कि सेंटर एलिमेंटेड टेक्स्टब्लॉक तक पहुंचने का आसान और तेज़ तरीका है

<TextBox
TextWrapping="Wrap"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
Background="{x:Null}"
BorderBrush="{x:Null}"
/>

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.