2013-02-19 20 views
5

Próbuję zastosować "wyrównanie tekstu" do elementu ContentControl. Ponieważ ContentControl nie ma poziomej ani pionowej właściwości wyrównania tekstu, takiej jak TextBlock, próbuję użyć właściwości HorizontalContentAlignment ContentControl.Wyrównywanie tekstu za pomocą ContentControl za pomocą właściwości HorizontalContentAlignment

Mój problem polega na tym, że nie mogę uruchomić go z samym ContentControl.

W moim przykładzie mam kontrolę treści wyświetlającą "Witaj świecie" i przycisk wyświetlający "zmień to".

Po kliknięciu przycisku ustawię HorizontalContentAlignment na formancie zawartości i przycisku. Treść przycisku zmienia się, ale treść kontrolki zawartości nie.

Tu jest mój kodu 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"> 
<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> 

I tu jest mój kod VB.NET dla zdarzenia kliknięcia przycisku:

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 

nie jestem w stanie wymienić moje kontroli treści z bloków tekstowych dla z różnych powodów, ale nadal muszę mieć możliwość dostosowania treści.

EDIT:

Podczas Narohi obejść prac sugestia, nadal jestem zdezorientowany, dlaczego własność HorizontalContentAlignment w kontroli treści nie ma wyrównać zawartość.

Wypróbowałem formant Label (który dziedziczy z ContentControl), a jego właściwość HorizontalContentAlignment właściwie wyrównuje zawartość.

(Edit znowu: Ja już nie mylić o to, wydaje się, że nie jest wykorzystywana HorizontalContentAlignment poprawnie we wszystkich przypadkach).

Tu jest mój zaktualizowany kod 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> 

Tutaj jest mój zaktualizowany kod 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 

Czekam na poradę,

-Frinny

+0

Czy można umieścić TextBlock w kontroli treści? –

Odpowiedz

7

Otwarcie domyślnego szablonu kontrolnego dla ContentControl w mieszance pokazuje, dlaczego oryginalne podejście nie działa.

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

Domyślny szablon nie robi nic z właściwością HorizontalContentAlignment których odziedziczonym Control. Przygotuj to z domyślnym szablonem Label.

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

Jak widać, etykieta faktycznie wiąże się z HorizontalContentAlignment. Formanty WPF są bez widoku, więc nigdy nie ma gwarancji, że właściwość będzie respektowana przez bieżący ControlTemplate. Spekulowałbym, że projektanci WPF nie respektowali właściwości HorizontalContentAlignment, ponieważ ludzie zazwyczaj umieszczają zawartość w tym polu niezależnie od właściwości ContentControl lub, być może, zakładali, że jeśli ktoś użyje takiej ogólnej kontroli, dostarczyłby własny szablon, taki jak ...

<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

Użyłem tej pracy (mój szablon kontrolny nie ma siatki, po prostu używał prezentera zawartości); jednak nadal jestem dość zdezorientowany, dlaczego właściwość HorizontalContentAlignment nie działa dla ContentControl, nawet jeśli wydaje się działać dla kontrolek, które dziedziczą z niego. Zaktualizowałem mój pierwotny wpis, aby uwzględnić inne próby kontroli. – Frinavale

+0

Narohi, dziękuję za pomoc. – Frinavale

+0

Nie ma za co. Dodam więcej informacji do postu. –

Powiązane problemy