5

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

私の問題は、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

さまざまな理由でコンテンツ コントロールをテキスト ブロックに置き換えることができませんが、それでもコンテンツを整列できるようにする必要があります。

編集:

Narohi は提案を回避する一方で、コンテンツ コントロールの Horizo​​ntalContentAlignment プロパティがコンテンツを整列させない理由について、私はまだ混乱しています。

Label コントロール (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

アドバイスをお待ちしております。

-フリニー

4

1 に答える 1

8

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>

ご覧のとおり、Label は実際には 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>
于 2013-02-19T21:14:05.870 に答える