0

私は次のスタイル (簡潔にするために削除) を持っており、それに基づいていくつか質問があります。私の理解では、ControlTemplate が Style の基になっているコントロールのビジュアル ツリー全体を置き換える場合、プロパティ Setters にはどのような効果がありますか?

この例では、FontSize、Margin、Height などのプロパティ Setters は、CheckBox 自体のそれぞれのプロパティに対応していませんか? コントロールの Template プロパティを置き換える場合、CheckBox がデフォルトの外観をレンダリングしなくなった場合、これらの Setter は何に対応しますか?

<Style x:Key="KeyName" TargetType="CheckBox">
    <Setter Property="FontSize" Value="11" />
    <Setter Property="Margin" Value="0 0 1 0" />
    <Setter Property="VerticalAlignment" Value="Top" />
    <Setter Property="Height" Value="18" />
    ... common property setters etc.

    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="CheckBox">
                <Border>
                    <StackPanel>
                        <Ellipse Name="Ellipse" Width="7" Height="7" />
                        <ContentPresenter Content="{TemplateBinding Content}" />
                    </StackPanel>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Trigger.Setters>
                            <Setter Property="Foreground" Value="WhiteSmoke" />
                        </Trigger.Setters>
                    </Trigger>
                        ... custom triggers etc ...
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
4

1 に答える 1

1

これらは、スタイルが設定されているオブジェクトのプロパティの初期デフォルト値を提供する方法であり、テンプレートで何も自動強制しません。ただし、コントロール テンプレートで使用することはできます。

スタイルでセッターを使用して設定された値は、xaml のローカル値でオーバーライドできます。例えば。

この xaml ファイルは、背景色のグリッドを含むようにスタイルが変更された単一のラベルを描画します。セッターでデフォルトの色を赤に設定すると、赤として表示されます。

<Window x:Class="ContextMenu.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>
        <Style TargetType="{x:Type Label}">
            <Setter Property="Background" Value="Red"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type Label}">
                        <Grid Background="{TemplateBinding Background}">
                            <TextBlock Text="{TemplateBinding Content}"/>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>

        </Style>
    </Window.Resources>

    <Label>Test</Label>
</Window>

ラベルのインスタンスでラベル行を青に変更した場合、これがセッターをオーバーライドすることがわかります。

<Window x:Class="ContextMenu.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>
        <Style TargetType="{x:Type Label}">
            <Setter Property="Background" Value="Red"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type Label}">
                        <Grid Background="{TemplateBinding Background}">
                            <TextBlock Text="{TemplateBinding Content}"/>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>

        </Style>
    </Window.Resources>

    <Label Background="Blue">Test</Label>
</Window>
于 2012-11-06T16:43:35.010 に答える