2013-02-19 16 views
5

ContentControlに「テキストの配置」を適用しようとしています。 ContentControlにはTextBlockのような水平または垂直のテキスト配置プロパティがないため、ContentControlのHorizo​​ntalContentAlignmentプロパティを使用しようとしています。Horizo​​ntalContentAlignmentプロパティを使用してテキストをContentControlに整列する

私の問題は、ContentControl自体で動作させることができないということです。

私の例では、私は "hello world"と "change it"と表示しているコンテンツコントロールを表示しています。

ボタンをクリックすると、コンテンツコントロールとボタンにHorizo​​ntalContentAlignmentが設定されます。ボタンのコンテンツは変更されますが、コンテンツコントロールのコンテンツは変更されません。ここで

は私の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> 

そしてここでは、ボタンのクリックイベントのための私のVB.NETコードです:

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 

私はテキストブロックで自分のコンテンツコントロールを交換することができませんさまざまな理由がありますが、私はまだコンテンツを整列させる必要があります。

EDIT:

提案作品の周りNarohiの仕事は、私はまだ、コンテンツコントロールのHorizo​​ntalContentAlignmentプロパティがコンテンツを整列しない理由について混乱していますが。

私はLabelControl(ContentControlから継承)を試しましたが、Horizo​​ntalContentAlignmentプロパティはコンテンツを適切に整列させました。

(編集再び:私はHorizo​​ntalContentAlignmentは、すべての場合に適切に利用されていないようだ、これについてはもはや混乱していません。)ここで

である私の更新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 

私は

、あなたのアドバイスを楽しみにしています

-Frinny

+0

コンテンツコントロール内にTextBlockを配置できますか? –

答えて

7

BlendでContentControlのデフォルトコントロールテンプレートを開くと、元のアプローチがうまくいかなかった理由がわかります。

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

デフォルトテンプレートは、Controlから継承したHorizo​​ntalContentAlignmentプロパティでは何も行いません。これを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> 

私たちが見ることができるように、ラベルは、実際にHorizo​​ntalContentAlignmentに結合します。 WPFコントロールは無意味なので、現在のControlTemplateによってプロパティが尊重されるという保証はありません。私は、WPFデザイナーはHorizo​​ntalContentAlignmentプロパティを尊重していないと推測します。なぜなら、人々は通常、ContentControlのプロパティとは独立したコンテンツを配置するか、あるいは、もし誰かが、 ...

<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

私はこの作品を使用しました(私のコントロールテンプレートはグリッドを持たず、コンテンツプレゼンターを使っただけです)。しかし、Horizo​​ntalContentAlignmentプロパティがコンテンツコントロールを継承しているコントロールでも機能しているように見えても、Horizo​​ntalContentAlignmentプロパティがContentControlで機能しない理由についてはまだ分かりません。元の投稿を更新して、他のコントロールの試行を追加しました。 – Frinavale

+0

ナロヒ、ご協力いただきありがとうございます。 – Frinavale

+0

ようこそ。私はポストにいくつかの情報を追加します。 –

関連する問題