आप लेबल के मार्जिन को लेबल के ActualWidth
और ActualHeight
पर बाध्य करके प्राप्त कर सकते हैं, और इन मानों को -0.5 के साथ गुणा कर सकते हैं। यह लेबल को आधे चौड़ाई से छोड़ देता है; और यह लेबल को ऊपर की ऊंचाई से ऊपर ले जाता है।
यहाँ एक उदाहरण है:
XAML:
<Window x:Class="CenteredLabelTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:CenteredLabelTest"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<local:CenterConverter x:Key="centerConverter"/>
</Window.Resources>
<Canvas>
<TextBlock x:Name="txt" Canvas.Left="40" Canvas.Top="40" TextAlignment="Center" Text="MMMMMM">
<TextBlock.Margin>
<MultiBinding Converter="{StaticResource centerConverter}">
<Binding ElementName="txt" Path="ActualWidth"/>
<Binding ElementName="txt" Path="ActualHeight"/>
</MultiBinding>
</TextBlock.Margin>
</TextBlock>
<Rectangle Canvas.Left="39" Canvas.Top="39" Width="2" Height="2" Fill="Red"/>
</Canvas>
</Window>
लाल आयत पर प्रकाश डाला समन्वय (40, 40) जिस पर लेबल "mmmmmm" केंद्रित है।
कनवर्टर:
public class CenterConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if (values[0] == DependencyProperty.UnsetValue || values[1] == DependencyProperty.UnsetValue)
{
return DependencyProperty.UnsetValue;
}
double width = (double) values[0];
double height = (double)values[1];
return new Thickness(-width/2, -height/2, 0, 0);
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
परिणाम इस प्रकार है:
public class Mover : DependencyObject
{
public static readonly DependencyProperty MoveToMiddleProperty =
DependencyProperty.RegisterAttached("MoveToMiddle", typeof (bool), typeof (Mover),
new PropertyMetadata(false, PropertyChangedCallback));
public static void SetMoveToMiddle(UIElement element, bool value)
{
element.SetValue(MoveToMiddleProperty, value);
}
public static bool GetMoveToMiddle(UIElement element)
{
return (bool) element.GetValue(MoveToMiddleProperty);
}
private static void PropertyChangedCallback(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
FrameworkElement element = sender as FrameworkElement;
if (element == null)
{
return;
}
if ((bool)e.NewValue)
{
MultiBinding multiBinding = new MultiBinding();
multiBinding.Converter = new CenterConverter();
multiBinding.Bindings.Add(new Binding("ActualWidth") {Source = element});
multiBinding.Bindings.Add(new Binding("ActualHeight") {Source = element});
element.SetBinding(FrameworkElement.MarginProperty, multiBinding);
}
else
{
element.ClearValue(FrameworkElement.MarginProperty);
}
}
}
:
आदेश है कि प्रोग्राम के रूप में करने के लिए, एक संलग्न संपत्ति Mover.MoveToMiddle
, इस तरह परिभाषित
सेट करनासे true
का अर्थ है कि उस ढांचे के तत्व का मार्जिन स्वचालित रूप से इसकी वास्तविक चौड़ाई और ऊंचाई से बंधे हैं जैसे फ्रेमवर्क तत्व को इसके केंद्र बिंदु पर ले जाया जाता है।
आप इस तरह अपने XAML कोड में यह प्रयोग करेंगे:
<Window x:Class="CenteredLabelTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:CenteredLabelTest"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<local:CenterConverter x:Key="centerConverter"/>
</Window.Resources>
<Canvas>
<TextBlock Canvas.Left="40" Canvas.Top="40" TextAlignment="Center" Text="MMMMMM"
local:Mover.MoveToMiddle="True"/>
<Rectangle Canvas.Left="39" Canvas.Top="39" Width="2" Height="2" Fill="Red"/>
</Canvas>
</Window>
एक वैकल्पिक RenderTransform
बजाय Margin
करने के लिए बाध्य होगा। इस मामले में, कनवर्टर
return new TranslateTransform(-width/2, -height/2);
वापसी होगी और संलग्न संपत्ति के कॉलबैक विधि इन पंक्तियों के होते हैं:
if ((bool)e.NewValue)
{
...
element.SetBinding(UIElement.RenderTransformProperty, multiBinding);
}
else
{
element.ClearValue(UIElement.RenderTransformProperty);
}
यह वैकल्पिक लाभ यह है कि संलग्न संपत्ति के प्रभाव दृश्य में दिखाई देता है है स्टूडियो डिजाइनर (जो मार्जिन प्रॉपर्टी सेट करते समय मामला नहीं है)।
लोग इन उत्तरों को देख सकते हैं और सोच सकते हैं कि प्रश्न की सरल आवश्यकताओं के लिए यह बहुत जटिल है, लेकिन यह आपको केवल एक लेबल को केंद्र में दिखाने का तरीका नहीं दिखा रहा है। यह कोड किसी ऐसे व्यवहार को परिभाषित कर रहा है जो किसी भी बिंदु पर 'फ्रेमवर्क एलिमेंट' को केन्द्रित करेगा और इसे केंद्रित रखेगा, भले ही उस तत्व का आकार बदल रहा हो। –
यह वास्तव में अच्छी तरह से काम करता है। एक्सएएमएल से उपयोग है: <टेक्स्टब्लॉक टेक्स्ट = "टेक्स्ट" सेंटरऑनपॉइंट.केंटरपॉइंट = "100,100" /> पॉइंट पर "100,100" के स्वचालित रूपांतरण पर ध्यान दें। –
पूरी तरह से काम करता है, यहां तक कि गैर WPF XAML उदा। विंडोज 10 सार्वभौमिक, धन्यवाद! –