উত্তর:
একটি পাঠ্যবন্ধ নিজেই উল্লম্ব সারিবদ্ধতা করতে পারে না
আমি খুঁজে পেয়েছি এটি করার সর্বোত্তম উপায় হ'ল পাঠ্যরূপটি একটি সীমানার ভিতরে রাখা, যাতে সীমানাটি আপনার জন্য প্রান্তিককরণ করে।
<Border BorderBrush="{x:Null}" Height="50">
<TextBlock TextWrapping="Wrap" Text="Some Text" VerticalAlignment="Center"/>
</Border>
দ্রষ্টব্য: এটি কার্যত গ্রিড ব্যবহারের সমতুল্য, এটি নির্ভর করে আপনি কীভাবে নিয়ন্ত্রণগুলি আপনার বাকী লেআউটের সাথে ফিট করতে চান তবে কোনটি আরও উপযুক্ত is
যদিও কালপুরুষ এডওয়ার্ডস উত্তর যে কোনো পরিস্থিতি জন্য কাজ করে, এটা সীমান্ত যোগ করতে পারেন এবং সীমান্ত বৈশিষ্ট্য প্রত্যেক সময় যখন আপনি এই কাজ করতে চান সেট করতে ব্যাথা হতে পারে। আর একটি দ্রুত উপায় হ'ল পাঠ্য ব্লকের প্যাডিং সেট করা:
<TextBlock Height="22" Padding="3" />
টেক্সটব্লক উল্লম্ব পাঠ্য প্রান্তিককরণ সমর্থন করে না।
আমি গ্রিডের সাহায্যে পাঠ্য ব্লকটি মোড়ানো এবং HorizontalAlignment = "স্ট্রেচ" এবং উল্লম্বআলাইনমেন্ট = "কেন্দ্র" সেট করে এটিকে ঘিরে কাজ করি।
এটার মত:
<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>
আপনি যদি পাঠ্য মোড়ানো ব্যতিরেকে করতে পারেন তবে আমি মনে করি যে পাঠ্যব্লককে একটি লেবেলের সাথে প্রতিস্থাপন করা এটি করার সবচেয়ে সার্থক উপায়। অন্যথায় অন্য একটি বৈধ উত্তর অনুসরণ করুন।
<Label Content="Some Text" VerticalAlignment="Center"/>
TextBlock
এর সামগ্রীতে উল্লম্ব সারিবদ্ধতা সমর্থন করে না। আপনি অবশ্যই ব্যবহার করুনTextBlock
তবে আপনাকে এটির পিতামাতার সাথে সম্মান সহ প্রান্তিককরণ করতে হবে।
তবে আপনি যদি এর Label
পরিবর্তে ব্যবহার করতে পারেন (এবং তাদের মধ্যে খুব অনুরূপ কার্যকারিতা রয়েছে) তবে আপনি পাঠ্য সামগ্রীটি অবস্থান করতে পারেন :
<Label VerticalContentAlignment="Center" HorizontalContentAlignment="Center">
I am centred text!
</Label>
Label
ডিফল্টরূপে তার সীমা পূরণ করতে প্রসারিত, যার অর্থ লেবেলের টেক্সট কেন্দ্রিক করা হবে।
আমার জন্য, VerticalAlignment="Center"
এই সমস্যাটি সমাধান করুন।
এটি TextBlock
গ্রিডে আবৃত হওয়ার কারণে এটি হতে পারে তবে ডাব্লুপিএফ-তে প্রায় সমস্ত জিনিসই তাই।
আমি দেখতে পেয়েছি যে পাঠ্যবাক্স শৈলীর (যেমন controltemplate
:) সংশোধন করা এবং তারপরে PART_ContentHost
কেন্দ্রের উল্লম্ব সারিবদ্ধকরণটি কৌশলটি সম্পাদন করবে
কেবল গিগলসের জন্য, এই এক্সএএমএলকে ঘূর্ণি দিন। এটি 'অ্যালাইনমেন্ট' না হওয়ায় এটি নিখুঁত নয় তবে এটি আপনাকে অনুচ্ছেদের মধ্যে পাঠ্য প্রান্তিককরণ সামঞ্জস্য করতে দেয়।
<TextBlock>
<TextBlock BaselineOffset="30">One</TextBlock>
<TextBlock BaselineOffset="20">Two</TextBlock>
<Run>Three</Run>
<Run BaselineAlignment="Subscript">Four</Run>
</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"
আপনি আমার ব্লগ পোস্ট দেখতে পারেন। আপনি কোডবিহাইন্ড থেকে টেক্সটব্লকের কাস্টম উচ্চতা সেট করতে পারেন। কাস্টম উচ্চতা নির্ধারণের জন্য আপনাকে এটিকে একটি সীমানা বা স্ট্যাকপ্যানেলে স্থাপন করতে হবে
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
কেবল অনুভূমিক প্রান্তিককরণকে প্রভাবিত করে, উল্লম্ব সারিবদ্ধকরণ নয় (প্রশ্নটি বোঝায় হিসাবে)।