जवाबों:
एक टेक्स्टब्लॉक स्वयं ऊर्ध्वाधर संरेखण नहीं कर सकता है
ऐसा करने का सबसे अच्छा तरीका है कि मैंने पाया है कि टेक्स्टब्लॉक को एक सीमा के अंदर रखना है, इसलिए सीमा आपके लिए संरेखण करती है।
<Border BorderBrush="{x:Null}" Height="50">
<TextBlock TextWrapping="Wrap" Text="Some Text" VerticalAlignment="Center"/>
</Border>
नोट: यह कार्यात्मक रूप से एक ग्रिड का उपयोग करने के बराबर है, यह सिर्फ इस बात पर निर्भर करता है कि आप अपने बाकी लेआउट के साथ कैसे फिट होना चाहते हैं जिसके लिए एक अधिक उपयुक्त है
जबकि ओरियन एडवर्ड्स उत्तर किसी भी स्थिति के लिए काम करता है, यह सीमा को जोड़ने और हर बार जब आप ऐसा करना चाहते हैं तो सीमा के गुणों को सेट करने के लिए दर्द हो सकता है। पाठ ब्लॉक की पैडिंग सेट करने के लिए एक और त्वरित तरीका है:
<TextBlock Height="22" Padding="3" />
TextBlock ऊर्ध्वाधर पाठ संरेखण का समर्थन नहीं करता है।
मैं इसके चारों ओर टेक्स्ट ब्लॉक को ग्रिड के साथ लपेटकर और क्षैतिज क्षैतिजता = "स्ट्रेच" और वर्टिकल-एलाइनमेंट = "केंद्र" सेट करके काम करता हूं।
ऐशे ही:
<Grid>
<TextBlock
HorizontalAlignment="Stretch"
VerticalAlignment="Center"
Text="Your text" />
</Grid>
TextBlock
पर Ellipse
एक के अंदर Grid
। मेरी चौड़ाई और ऊंचाई के गुणों को बांधने या कुछ भी मुश्किल करने की आवश्यकता नहीं है।
आप टेक्स्टब्लॉक के बजाय लेबल का उपयोग कर सकते हैं।
<Label Content="Hello, World!">
<Label.LayoutTransform>
<RotateTransform Angle="270"/>
</Label.LayoutTransform>
</Label>
यदि आप पाठ रैपिंग के बिना कर सकते हैं , तो मुझे लगता है कि एक लेबल के साथ TextBlock की जगह ऐसा करने का सबसे रसीला तरीका है। अन्यथा अन्य मान्य उत्तरों में से एक का पालन करें।
<Label Content="Some Text" VerticalAlignment="Center"/>
TextBlock
अपनी सामग्री के ऊर्ध्वाधर संरेखण का समर्थन नहीं करता है। यदि आप उपयोग करना चाहते हैं TextBlock
तो आपको इसके अभिभावक के साथ इसे संरेखित करना होगा।
हालाँकि यदि आप Label
इसके बजाय उपयोग कर सकते हैं (और उनके पास समान कार्यक्षमता है) तो आप पाठ सामग्री को रख सकते हैं :
<Label VerticalContentAlignment="Center" HorizontalContentAlignment="Center">
I am centred text!
</Label>
Label
डिफ़ॉल्ट रूप से अपनी सीमा को भरने के लिए खिंचाव, जिसका अर्थ है लेबल के पाठ केंद्रित किया जाएगा।
मेरे लिए, VerticalAlignment="Center"
इस समस्या को ठीक करता है।
यह हो सकता है क्योंकि TextBlock
एक ग्रिड में लिपटे हुए है, लेकिन फिर wpf में व्यावहारिक रूप से सब कुछ है।
मैंने पाया है कि टेक्स्टबॉक्स शैली (यानी controltemplate
:) को संशोधित करना और फिर PART_ContentHost
केंद्र के लिए ऊर्ध्वाधर संरेखण को संशोधित करना चाल होगा
बस गिगल्स के लिए, इस एक्सएएमएल को एक चक्कर दें। यह सही नहीं है क्योंकि यह एक 'संरेखण' नहीं है, लेकिन यह आपको एक अनुच्छेद के भीतर पाठ संरेखण को समायोजित करने की अनुमति देता है।
<TextBlock>
<TextBlock BaselineOffset="30">One</TextBlock>
<TextBlock BaselineOffset="20">Two</TextBlock>
<Run>Three</Run>
<Run BaselineAlignment="Subscript">Four</Run>
</TextBlock>
यदि आप TextBlock की ऊँचाई को अनदेखा कर सकते हैं, तो आपके लिए इसका उपयोग करना बेहतर होगा:
<TextBlock Height="{Binding}" Text="Your text"
TextWrapping="Wrap" VerticalAlignment="Center" Width="28"/>
मेरे मामले में, मैंने 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"
आप मेरी ब्लॉग पोस्ट देख सकते हैं। आप codebehind से Textblock की कस्टम ऊंचाई सेट कर सकते हैं। कस्टम ऊंचाई सेट करने के लिए आपको इसे एक सीमा या स्टैकपैन के अंदर स्थापित करने की आवश्यकता है
http://ciintelligence.blogspot.com/2011/02/wpf-textblock-vertical-alignment-with.html
मैंने पाया कि मुझे इसे थोड़ा अलग करना था। मेरी समस्या यह थी कि यदि मैंने फ़ॉन्ट आकार को बदल दिया, तो पाठ पंक्ति के बाकी टेक्स्टबॉक्स के साथ नीचे की ओर बने रहने के बजाय टेक्स्टबॉक्स में ऊपर चला जाएगा। ऊपर से नीचे की ओर लंबवत संरेखण को बदलकर मैं फ़ॉन्ट को प्रोग्राम 20 से आकार 14 और वापस आकार में बदलने में सक्षम था, पाठ के गुरुत्वाकर्षण को नीचे और चीजों को साफ-सुथरा रखने पर। ऐसे:
@ ओरियन एडवर्ड्स द्वारा दिए गए उत्तर पर विस्तार करने के लिए, यह है कि आप कोड-पीछे (कोई भी शैली सेट) से पूरी तरह से कैसे करेंगे। मूल रूप से एक कस्टम वर्ग बनाते हैं जो बॉर्डर से विरासत में मिला है, जिसमें उसका चाइल्ड टेक्स्टबॉक्स है। नीचे दिए गए उदाहरण में माना गया है कि आप केवल एक ही लाइन चाहते हैं और यह कि सीमा एक कैनवस का बच्चा है। यह भी मानता है कि आपको बॉर्डर की चौड़ाई के आधार पर टेक्स्टबॉक्स की मैक्सलेंथ प्रॉपर्टी को समायोजित करने की आवश्यकता होगी। नीचे दिया गया उदाहरण बॉर्डर के कर्सर को एक टेक्स्टबॉक्स की नकल करने के लिए '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;
}
}
}
मुझे लगता है कि लेबल में एक लेबल (या टेक्स्टब्लॉक) का उपयोग करना बेहतर है, आप सीधे सीमा नियंत्रण में एक माउस घटना को संलग्न नहीं कर सकते, आखिरकार यह टेक्स्टब्लॉक में संलग्न है, यह मेरा पुनर्संस्थापन है:
<Label
Height="32"
VerticalContentAlignment="Center"
HorizontalContentAlignment="Stretch"
MouseLeftButtonUp="MenuItem_MouseLeftButtonUp">
<TextBlock Padding="32 0 10 0">
Label with click event
</TextBlock>
</Label>
मुझे लगता है कि बिना किसी बॉर्डर और बैकग्राउंड वाले टेक्स्टबॉक्स का इस्तेमाल करना एक आसान और तेज़ तरीका है, जो कि सेंटर एलिमेंटेड टेक्स्टब्लॉक तक पहुंचने का आसान और तेज़ तरीका है
<TextBox
TextWrapping="Wrap"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
Background="{x:Null}"
BorderBrush="{x:Null}"
/>
<TextBox AcceptsReturn="True"
TextWrapping="Wrap"
VerticalContentAlignment="Top" >
</TextBox>
TextBlock
, नहीं TextBox
। -1
TextAlignment
केवल क्षैतिज संरेखण को प्रभावित करता है, न कि ऊर्ध्वाधर संरेखण को (जैसा कि प्रश्न संदर्भित करता है)।