Локальный, элементный стиль, не применимый к детям

Я новичок в WPF, и я застрял, пытаясь понять, почему ниже XAML не делает то, что, как я считаю, должно:

<ToolBar HorizontalAlignment="Left" Margin="255,250,0,0" VerticalAlignment="Top">
    <ToolBar.Resources>
        <Style TargetType="{x:Type Separator}">
            <Setter Property="Margin" Value="4,6" />
        </Style>
    </ToolBar.Resources>
    <Button Content="Save"/>
    <Button Content="Cancel"/>
    <Separator />
    <Button Content="Options"/>
</ToolBar>

Это должно вызвать <Separator /> иметь наценку 4,6 но это только так, если я явно указать x:Key на стиль и <Separator Style="..." />,

Из того, что я узнал до сих пор, мой <Style TargetType="{x:Type Separator}"> следует применять ко всем разделителям внутри <ToolBar>, его дочерние элементы, его детские дети и так далее.

Что я делаю не так?

1 ответ

Решение

Вы должны установить x:Key в {x:Static ToolBar.SeparatorStyleKey} для стиля применяется в ToolBar:

<ToolBar HorizontalAlignment="Left" Margin="255,250,0,0" VerticalAlignment="Top">
    <ToolBar.Resources>
        <Style x:Key="{x:Static ToolBar.SeparatorStyleKey}" TargetType="{x:Type Separator}">
            <Setter Property="Margin" Value="4,6" />
            <Setter Property="Background" Value="Red" />
        </Style>
    </ToolBar.Resources>
    <Button Content="Save"/>
    <Button Content="Cancel"/>
    <Separator />
    <Button Content="Options"/>
</ToolBar>

Это потому что ToolBar Класс содержит некоторую "специальную" логику для применения стилей по умолчанию к некоторым типам элементов управления, включая Separator: https://referencesource.microsoft.com/#PresentationFramework/src/Framework/System/Windows/Controls/ToolBar.cs,5d1684510f45eeb3

Другие вопросы по тегам