Основать ControlTemplate на другом ControlTemplate - PullRequest
5 голосов
/ 02 сентября 2011

Я знаю, что на это должен быть простой ответ, но я не могу его найти.

У меня есть стиль кнопки под названием HoverButton.

<Style x:Key="HoverButton" TargetType="Button">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <Border>
                    <ContentPresenter/>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter Property="BorderBrush" Value="Black"/>
                        <Setter Property="Background" Value="WhiteSmoke"/>
                        <Setter Property="Foreground" Value="DarkRed"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="BorderBrush" Value="Transparent"/>
    <Setter Property="Background" Value="Transparent"/>
</Style>

Затем я хочу создать еще один «производный» стиль, основанный на HoverButton с конкретным контентом. Я уменьшил сложность описанного выше стиля, но он достаточно сложный, поэтому я не хочу копировать и вставлять его.

<Style x:Key="CloseButton" BasedOn="{StaticResource HoverButton}" TargetType="{x:Type Button}">
    <Setter Property="Content">
        <Setter.Value>
            <Path Width="8" Height="8" Stroke="{Binding Foreground, RelativeSource={RelativeSource FindAncestor, AncestorType=Button}}" Data="M0,0 L8,8 M8,0 L0,8" StrokeThickness="2" />
        </Setter.Value>
    </Setter>
</Style>

Это не работает - «Указанный элемент уже является логическим дочерним элементом другого элемента. Сначала отключите его». Кажется, мне нужно переопределить свойство Template производного стиля, но как-то ссылаться на шаблон базового стиля.

Есть идеи?

1 Ответ

3 голосов
/ 02 сентября 2011

Вы не можете основывать шаблоны друг на друге, но эту ошибку можно легко устранить. Просто создайте эквивалент ContentTemplate вместо установки Content. Таким образом, создается одна Path для каждой кнопки, а не одна для всех кнопок (что недопустимо).

...