2013-02-19 9 views
5

Ich versuche, eine Textausrichtung auf ein ContentControl anzuwenden. Da das ContentControl keine horizontale oder vertikale Textausrichtungseigenschaft wie der TextBlock hat, versuche ich die HorizontalContentAlignment-Eigenschaft des ContentControls zu verwenden.Ausrichten von Text mit einem ContentControl mithilfe der HorizontalContentAlignment-Eigenschaft

Mein Problem ist, dass ich es nicht mit einem ContentControl selbst arbeiten kann.

In meinem Beispiel habe ich eine Inhaltskontrolle, die "Hallo Welt" anzeigt und eine Schaltfläche, die "es ändern" anzeigt.

Wenn ich auf die Schaltfläche klicke, setze ich die HorizontalContentAlignment auf das Inhaltssteuerelement und auf die Schaltfläche. Der Inhalt der Schaltfläche ändert sich, der Inhalt des Inhaltssteuerelements jedoch nicht.

Hier ist meine XAML-Code:

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

Und hier ist mein VB.NET-Code für die Schaltfläche klicken Ereignis:

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 

Ich kann nicht meine Inhalte Kontrollen mit Textblöcke ersetzen für verschiedene Gründe, aber ich muss noch in der Lage sein, den Inhalt auszurichten.

EDIT:

Während Narohi Arbeit um Vorschlag funktioniert, bin ich immer noch verwirrt darüber, warum der Horizontalcontentalignment-Eigenschaft des Inhaltskontrolle nicht den Inhalt auszurichten.

Ich habe versucht, ein Label-Steuerelement (das von ContentControl erbt) und seine HorizontalContentAlignment -Eigenschaft richtet den Inhalt ordnungsgemäß aus.

(Edit wieder: Ich bin nicht mehr verwirrt darüber, wie es scheint, dass der Horizontalcontentalignment nicht in allen Fällen verwendet wird.)

Hier ist mein aktualisierte XAML-Code:

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

Hier meine aktualisiert ist VB.NET-Code:

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 

ich mich auf Ihren Rat bin auf der Suche,

-Frinny

+0

Können Sie einen TextBlock in die Inhaltssteuerung einfügen? –

Antwort

7

Das Öffnen der Standardsteuervorlage für ContentControl in Blend zeigt, warum Ihre ursprüngliche Vorgehensweise nicht funktioniert hat.

Die Standardvorlage tut nichts mit der Eigenschaft HorizontalContentAlignment, die von Control geerbt wurde. Legen Sie das mit der Standardvorlage von Label gegenüber.

Wie wir sehen können, bindet das Label tatsächlich an die HorizontalContentAlignment. WPF-Steuerelemente sind blicklos, daher gibt es keine Garantie, dass eine Eigenschaft von der aktuellen ControlTemplate eingehalten wird. Ich würde spekulieren, dass die WPF-Designer die HorizontalContentAlignment-Eigenschaft nicht respektierten, weil die Leute Inhalte normalerweise unabhängig von den Eigenschaften des ContentControls platzieren oder annehmen, dass jemand, der ein solches generisches Steuerelement verwenden würde, eine eigene Vorlage wie z ...

<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

Ich habe diese Arbeit verwendet (meine Kontrollvorlage hat kein Raster, sie hat nur den Inhalts-Presenter verwendet); Allerdings bin ich immer noch ziemlich verwirrt, warum die HorizontalContentAlignment-Eigenschaft für ein ContentControl nicht funktioniert, obwohl es für Steuerelemente zu funktionieren scheint, die von ihm erben. Ich habe meinen ursprünglichen Beitrag aktualisiert, um weitere Kontrollversuche einzubeziehen. – Frinavale

+0

Narohi, danke für deine Hilfe. – Frinavale

+0

Gern geschehen. Ich werde dem Beitrag weitere Informationen hinzufügen. –

Verwandte Themen