2009-09-29 15 views
179

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

+0

@shr और अन्य: ध्यान दें कि 'टेक्स्ट एलाइनमेंट' केवल क्षैतिज संरेखण को प्रभावित करता है, न कि * लंबवत * संरेखण (जैसा कि प्रश्न संदर्भित करता है)। –

उत्तर

223

एक TextBlock ही खड़ी संरेखण यह है कि मैंने पाया एक सीमा के अंदर TextBlock डाल करने के लिए है करने के लिए

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

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

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

+18

+1 लंबवत संरेखण प्रभाव के लिए सीमा की ऊंचाई निर्धारित की जानी चाहिए। –

+13

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

+17

@gav - टेक्स्ट एलाइनमेंट केवल क्षैतिज संरेखण करता है ... प्रश्न लंबवत संरेखण के बारे में है –

46

टेक्स्टब्लॉक वर्टिकल टेक्स्ट संरेखण का समर्थन नहीं करता है।

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

इस तरह:

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

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

+0

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

1

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

76

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

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

मुझे लगता है कि यह सबसे शानदार जवाब है। –

+1

कि मुझे देखने के लिए देखा गया था !!! धन्यवाद! –

+1

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

0

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

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

14

आप TextBlock के बजाय लेबल का उपयोग कर सकते की जरूरत है।

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

अच्छा, लेबल वर्टिकलकंटेंटलाइन है। Greeeat। +1 –

+3

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

+18

यह सवाल है कि लंबवत पाठ का उत्पादन कैसे करें, वर्टिकल संरेखण को कैसे लागू करें! –

1

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

+0

ओपी पूछ रहा है टेक्स्टब्लॉक के बारे में। उनके पास ControlTemplates नहीं है। – ANeves

1

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

<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" 
1

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

enter image description here

1

Vertically aligned single line TextBox.

@Orion एडवर्ड्स द्वारा प्रदान की जवाब पर विस्तार करने के लिए, इस (कोई शैली निर्धारित) कैसे आप से कोड-पीछे पूरी तरह से करना होगा है। असल में एक कस्टम क्लास बनाएं जो सीमा से विरासत में हो, जिसके बच्चे को टेक्स्टबॉक्स पर सेट किया गया हो। नीचे दिया गया उदाहरण मानता है कि आप केवल एक पंक्ति चाहते हैं और सीमा सीमा कैनवास का बच्चा है। यह भी मानता है कि आपको सीमा की चौड़ाई के आधार पर टेक्स्टबॉक्स की अधिकतम लम्बाई संपत्ति समायोजित करने की आवश्यकता होगी। नीचे दिया गया उदाहरण भी 'आईबीएम' प्रकार पर सेट करके टेक्स्टबॉक्स की नकल करने के लिए सीमा के कर्सर को सेट करता है। '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

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

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

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

<Label Content="Some Text" VerticalAlignment="Center"/> 
0
<TextBox AcceptsReturn="True" 
      TextWrapping="Wrap" 
      VerticalContentAlignment="Top" > 
    </TextBox> 
+0

प्रश्न 'टेक्स्टब्लॉक' के लिए था, न कि 'टेक्स्टबॉक्स'। -1 – KnorxThieus

0

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

हालांकि आप Label बजाय उपयोग कर सकते हैं (और वे बहुत इसी तरह की सुविधा है) तो आप कर सकते हैं स्थिति पाठ सामग्री:

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

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

संबंधित मुद्दे