2013-02-19 57 views
5

मैं ContentControl पर "टेक्स्ट संरेखण" लागू करने का प्रयास कर रहा हूं। चूंकि ContentControl में टेक्स्टब्लॉक जैसी क्षैतिज या ऊर्ध्वाधर टेक्स्ट संरेखण प्रॉपर्टी नहीं है, इसलिए मैं ContentControl की क्षैतिज सामग्री अटलांटमेंट प्रॉपर्टी का उपयोग करने का प्रयास कर रहा हूं।क्षैतिज सामग्री का उपयोग कर सामग्री नियंत्रण के साथ टेक्स्ट संरेखित करें

मेरी समस्या यह है कि मैं इसे ContentControl के साथ काम करने के लिए नहीं मिल सकता।

मेरे उदाहरण में, मेरे पास "हैलो वर्ल्ड" प्रदर्शित करने वाला एक सामग्री नियंत्रण है और "इसे बदलें" प्रदर्शित करने वाला एक बटन है।

जब मैं बटन पर क्लिक करता हूं, तो मैंने सामग्री नियंत्रण और बटन पर क्षैतिज सामग्री संरेखण सेट किया है। बटन की सामग्री बदलती है, लेकिन सामग्री नियंत्रण की सामग्री नहीं होती है। यहाँ

<Window x:Class="MainWindow" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="MainWindow" Height="350" Width="525"> 
<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition /> 
     <RowDefinition /> 
    </Grid.RowDefinitions> 
    <ContentControl x:Name="ctrl" Width="525"> 
     Hello World! 
    </ContentControl> 
    <Button x:Name="btn" Grid.Row="1" Content="Change It" Click="btn_Click"/> 
</Grid> 
</Window> 

और बटन क्लिक करें घटना के लिए मेरे VB.NET कोड है:

यहाँ मेरी XAML कोड है मैं के लिए पाठ ब्लॉक के साथ मेरी सामग्री नियंत्रण को बदलने के लिए असमर्थ हूँ

Class MainWindow 

    Private Sub btn_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) 
    If (ctrl.HorizontalContentAlignment = HorizontalAlignment.Left) Then 
     ctrl.HorizontalContentAlignment = HorizontalAlignment.Right 
     btn.HorizontalContentAlignment = Windows.HorizontalAlignment.Right 
    Else 
     ctrl.HorizontalContentAlignment = HorizontalAlignment.Left 
     btn.HorizontalContentAlignment = Windows.HorizontalAlignment.Left 
    End If 
    ctrl.UpdateLayout() 
    End Sub 

End Class 

विभिन्न कारणों से, लेकिन मुझे अभी भी सामग्री को संरेखित करने में सक्षम होना चाहिए।

संपादित करें:

जबकि Narohi सुझाव काम करता है चारों ओर काम करते हैं, मैं अभी भी क्यों सामग्री नियंत्रण के HorizontalContentAlignment संपत्ति सामग्री संरेखित नहीं है उलझन में हूँ।

मैंने लेबल नियंत्रण (जो ContentControl से विरासत में मिला है) की कोशिश की और यह क्षैतिज सामग्री अटलांटमेंट संपत्ति सामग्री को ठीक से संरेखित करती है।

(संपादित करें फिर से: मैं अब इस बारे में उलझन में हूँ, ऐसा लगता है कि HorizontalContentAlignment सभी मामलों में ठीक से उपयोग नहीं किया जाता है।)

यहाँ है मेरी अद्यतन XAML कोड:

<Window x:Class="MainWindow" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="MainWindow" Height="350" Width="525"> 
<Window.Resources> 
    <ControlTemplate x:Key="AlignmentAwareControl" TargetType="ContentControl"> 
      <ContentPresenter VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
         HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"/> 
    </ControlTemplate> 
</Window.Resources> 
<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition /> 
     <RowDefinition /> 
     <RowDefinition /> 
     <RowDefinition /> 
    </Grid.RowDefinitions> 
    <ContentControl x:Name="ctrlTxt" Grid.Row="0" 
        Template="{StaticResource AlignmentAwareControl}" 
        HorizontalContentAlignment="Center" Padding="0">Hello World Content Control!</ContentControl> 
    <Label x:Name="ctrl" Grid.Row="1" HorizontalContentAlignment="Center" Padding="0">Hello World Label!</Label> 
    <ContentControl x:Name="ctrlImg" Grid.Row="2" 
        Template="{StaticResource AlignmentAwareControl}" 
        HorizontalContentAlignment="Center"> 
     <Image Source="C:\Users\Frinavale\Pictures\Business_Woman.jpg"/> 
    </ContentControl> 

    <Button x:Name="btn" Grid.Row="3" Content="Change It" Click="btn_Click"/> 
</Grid> 
</Window> 

यहाँ मेरे अद्यतन VB.NET कोड है:

Class MainWindow 

    Private Sub btn_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) 
    If (ctrl.HorizontalContentAlignment = HorizontalAlignment.Left) Then 
     ctrlImg.SetValue(ContentControl.HorizontalContentAlignmentProperty, Windows.HorizontalAlignment.Right) 
     ctrlTxt.SetValue(ContentControl.HorizontalContentAlignmentProperty, Windows.HorizontalAlignment.Right) 
     ctrl.SetValue(ContentControl.HorizontalContentAlignmentProperty, Windows.HorizontalAlignment.Right) 
     btn.HorizontalContentAlignment = Windows.HorizontalAlignment.Right 
    Else 
     ctrlImg.SetValue(ContentControl.HorizontalContentAlignmentProperty, Windows.HorizontalAlignment.Left) 
     ctrlTxt.SetValue(ContentControl.HorizontalContentAlignmentProperty, Windows.HorizontalAlignment.Left) 
     ctrl.SetValue(ContentControl.HorizontalContentAlignmentProperty, Windows.HorizontalAlignment.Left) 
     btn.HorizontalContentAlignment = Windows.HorizontalAlignment.Left 
    End If 
    ctrl.UpdateLayout() 
    End Sub 
End Class 

मैं आगे आपकी सलाह के लिए देख रहा हूँ,

-फ्रिनी

+0

क्या आप सामग्री नियंत्रण में टेक्स्टब्लॉक डाल सकते हैं? –

उत्तर

7

ब्लेंड में ContentControl के लिए डिफ़ॉल्ट नियंत्रण टेम्पलेट खोलने से पता चलता है कि आपका मूल दृष्टिकोण क्यों काम नहीं करता है।

<ControlTemplate TargetType="{x:Type ContentControl}"> 
    <ContentPresenter/> 
</ControlTemplate> 

डिफ़ॉल्ट टेम्पलेट क्षैतिजकंटेंटलाइन संपत्ति के साथ कुछ भी नहीं करता है जिसे इसे नियंत्रण से विरासत में मिला है। लेबल के डिफ़ॉल्ट टेम्पलेट के साथ इसे जुटापोज़ करें।

<ControlTemplate TargetType="{x:Type Label}"> 
    <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true"> 
     <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> 
    </Border> 
    <ControlTemplate.Triggers> 
     <Trigger Property="IsEnabled" Value="false"> 
      <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/> 
     </Trigger> 
    </ControlTemplate.Triggers> 
</ControlTemplate> 

जैसा कि हम देख सकते हैं, लेबल वास्तव में क्षैतिज सामग्री संरेखण से जुड़ा हुआ है। डब्ल्यूपीएफ नियंत्रण लापरवाह हैं, इसलिए कभी गारंटी नहीं है कि वर्तमान नियंत्रण टेम्पलेट द्वारा एक संपत्ति का सम्मान किया जाएगा। मैं अनुमान लगाता हूं कि डब्ल्यूपीएफ डिजाइनरों ने क्षैतिज कंटेंट एलाइनमेंट प्रॉपर्टी का सम्मान नहीं किया क्योंकि लोग आमतौर पर कंटेंट कंट्रोल के गुणों से स्वतंत्र होते हैं या शायद वे मानते हैं कि कोई ऐसा सामान्य नियंत्रण उपयोग करने जा रहा है, तो वे अपना टेम्पलेट प्रदान करेंगे, जैसे कि ...

<ContentControl x:Name="ctrl" Width="525"> 
    <ContentControl.Template> 
     <ControlTemplate TargetType="ContentControl"> 
      <Grid> 
       <ContentPresenter VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
            HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"/> 
      </Grid> 
     </ControlTemplate> 
    </ContentControl.Template> 
    Hello World! 
</ContentControl> 
+0

मैंने इस काम का उपयोग आसपास किया (मेरे नियंत्रण टेम्पलेट में ग्रिड नहीं है, यह सिर्फ सामग्री प्रस्तुति का उपयोग करता है); हालांकि मैं अभी भी काफी उलझन में हूं कि क्यों क्षैतिज सामग्री अटलांटमेंट प्रॉपर्टी कंटेंट कंट्रोल के लिए काम नहीं करती है, भले ही ऐसा लगता है कि इससे प्राप्त नियंत्रणों के लिए काम करना प्रतीत होता है। मैंने अन्य मूल प्रयासों को शामिल करने के लिए अपनी मूल पोस्ट अपडेट की। – Frinavale

+0

नरोही, आपकी मदद के लिए धन्यवाद। – Frinavale

+0

आपका स्वागत है। मैं पोस्ट में कुछ और जानकारी जोड़ूंगा। –