سؤال

كيف يمكنني تعيين محاذاة مركز عمودي للنص داخل TextBlock؟ لقد وجدت خاصية TextAlignment ولكنها مخصصة لمحاذاة النص الأفقي. كيف أفعل ذلك لمحاذاة النص العمودي؟

هل كانت مفيدة؟

المحلول

textblock نفسه لا يمكن القيام بمحاذاة رأسية

أفضل طريقة للقيام بذلك هي التي وجدتها هي وضع TextBlock داخل الحدود، وبالتالي فإن الحدود يقوم بها المحاذاة لك.

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

ملاحظة: هذا يعادل بشكل عام لاستخدام شبكة، فإنه يعتمد فقط على الطريقة التي تريدها عناصر التحكم لتناسب مع بقية تخطيطك كما هو أكثر ملاءمة

نصائح أخرى

في حين أوريون إدواردز الإجابة يعمل من أجل أي موقف، قد يكون من الألم لإضافة الحدود وتعيين خصائص الحدود في كل مرة تريد القيام بذلك. طريقة سريعة أخرى هي تعيين حشوة كتلة النص:

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

لا يدعم TextBlock محاذاة النص العمودي.

أعمل حول هذا عن طريق التخلص من كتلة النص مع شبكة وإعداد HorizontAlignment = "تمتد" و VerticalInment = "Center".

مثله:

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

يمكنك استخدام التسمية بدلا من TextBlock.

<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.

لقد وجدت أن تعديل نمط TextBox (أي: controltemplate) ثم تعديل PART_ContentHost المحاذاة الرأسية إلى المركز سوف تفعل الخدعة

فقط للضحك، امنح هذا xaml دوامة. إنه ليس مثاليا لأنه ليس "محاذاة" لكنه يسمح لك بضبط محاذاة النص ضمن فقرة.

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

يمكنك أن ترى بلدي بلوق البريد. يمكنك ضبط ارتفاع مخصص TextBlock من CodeBehind. لإعداد ارتفاع مخصص تحتاج إلى تعيينه في الداخل في حدود أو StackPanel

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

لقد وجدت أنني اضطررت للقيام بذلك مختلفة قليلا. كانت مشكلتي أنه إذا قمت بتغيير حجم الخط، فسوف يترك النص في مربع النص بدلا من البقاء في الأسفل مع بقية مربع النصوص على السطر. عن طريق تغيير محاذاة Vert من أعلى إلى أسفل، كنت قادرا على تغيير الخط برمجيا من الحجم 20 إلى الحجم 14 والظهر، مع الحفاظ على جاذبية النص في الأسفل والحفاظ على أشياء أنيقة. إليك الطريقة:

enter image description here

Vertically aligned single line TextBox.

للتوسع في الإجابة التي توفرهاorion Edwards، فهذه هي الطريقة التي ستفعلها بالكامل من الكود الخلف (بدون مجموعة أنماط). قم بشكل أساسي بإنشاء فئة مخصصة ترث من الحدود التي يتمتع بها طفلها إلى مربع نص. يفترض المثال أدناه أنك تريد فقط سطر واحد وأن الحدود عبارة عن طفل من قماش. يفترض أيضا أنك ستحتاج إلى ضبط خاصية MaxLength من مربع النص بناء على عرض الحدود. يضع المثال أدناه أيضا مؤشر الحدود لتقليد مربع نص عن طريق تعيينه إلى النوع "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;
        }
    }
}

أعتقد أنه من الأفضل استخدام تسمية (أو TextBlock) في تسمية، لا يمكنك إرفاق حدث ماوس مباشرة في عنصر تحكم الحدود، وأخيرا يتم إرفاقه في TextBlock، فهذا هو أولي:

<Label 
    Height="32"
    VerticalContentAlignment="Center"
    HorizontalContentAlignment="Stretch"
    MouseLeftButtonUp="MenuItem_MouseLeftButtonUp">
    <TextBlock Padding="32 0 10 0">
        Label with click event
    </TextBlock>
</Label>
  <TextBox AcceptsReturn="True" 
           TextWrapping="Wrap"  
           VerticalContentAlignment="Top" >
  </TextBox>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top