2013-02-19 40 views
5

Tôi đang cố áp dụng "căn chỉnh văn bản" cho ContentControl. Kể từ khi ContentControl không có một tài sản căn chỉnh ngang hoặc dọc như TextBlock, tôi đang cố gắng sử dụng thuộc tính HorizontalContentAlignment của ContentControl.Căn chỉnh văn bản bằng ContentControl bằng thuộc tính HorizontalContentAlignment

Vấn đề của tôi là tôi không thể làm cho nó hoạt động với chính ContentControl.

Trong ví dụ của mình, tôi có kiểm soát nội dung hiển thị "hello world" và nút hiển thị "thay đổi".

Khi tôi nhấp vào nút, tôi đặt HorizontalContentAlignment trên điều khiển nội dung và trên nút. Nội dung của nút thay đổi, nhưng nội dung của nội dung kiểm soát thì không.

Đây là mã XAML của tôi:

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

Và đây là mã VB.NET của tôi cho sự kiện nhấn nút:

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 

Tôi không thể thay thế điều khiển nội dung của tôi với các khối văn bản cho nhiều lý do khác nhau, nhưng tôi vẫn cần có khả năng căn chỉnh nội dung.

EDIT:

Trong khi Narohi việc xung quanh công trình gợi ý, tôi vẫn còn lúng túng về việc tại sao sở hữu HorizontalContentAlignment kiểm soát nội dung không sắp xếp nội dung.

Tôi đã thử điều khiển Nhãn (được kế thừa từ ContentControl) và thuộc tính HorizontalContentAlignment của nó phù hợp đúng nội dung.

(Chỉnh sửa lần nữa: Tôi không còn bối rối về vấn đề này, có vẻ như rằng HorizontalContentAlignment không sử dụng đúng trong mọi trường hợp.)

Đây là mã XAML cập nhật của tôi:

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

đây là mã của tôi cập nhật 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 

tôi đang mong chờ đến lời khuyên của bạn,

-Frinny

+0

Bạn có thể đặt một TextBlock trong kiểm soát nội dung không? –

Trả lời

7

Mở mẫu kiểm soát mặc định cho ContentControl trong Blend cho biết lý do khiến phương pháp tiếp cận ban đầu của bạn không hoạt động.

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

Mẫu mặc định không có gì với thuộc tính HorizontalContentAlignment mà nó kế thừa từ Kiểm soát. Juxtapose điều này với mẫu mặc định của 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> 

Như chúng ta có thể thấy, Nhãn thực sự gắn với HorizontalContentAlignment. Điều khiển WPF là vô nghĩa, do đó, không bao giờ có một đảm bảo rằng một tài sản sẽ được tôn trọng bởi ControlTemplate hiện hành. Tôi dự đoán rằng các nhà thiết kế WPF không tôn trọng thuộc tính HorizontalContentAlignment vì mọi người thường đặt nội dung trong đó độc lập với các thuộc tính của ContentControl hoặc có thể họ giả định nếu ai đó sử dụng điều khiển chung như vậy, họ sẽ cung cấp mẫu của riêng họ, chẳng hạn như ...

<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

Tôi đã sử dụng công việc này xung quanh (mẫu kiểm soát của tôi không có lưới, nó chỉ sử dụng trình bày nội dung); Tuy nhiên tôi vẫn còn khá bối rối là tại sao các tài sản HorizontalContentAlignment không làm việc cho một ContentControl mặc dù nó có vẻ làm việc cho các điều khiển kế thừa từ nó. Tôi đã cập nhật bài đăng gốc của mình để bao gồm các nỗ lực kiểm soát khác. – Frinavale

+0

Narohi, cảm ơn sự giúp đỡ của bạn. – Frinavale

+0

Bạn được chào đón. Tôi sẽ thêm một số thông tin vào bài đăng. –

Các vấn đề liên quan