Я сейчас пытаюсь создать ControlTemplate
для класса Button
в WPF, заменив обычное визуальное дерево на то, что делает кнопку похожей на маленькую (X) закрыть значок на вкладках Google Chrome. Я решил использовать объект Path
в XAML для достижения эффекта. Используя триггер свойств, элемент управления реагирует на изменение свойства IsMouseOver, установив красный фон значка.Сеттер в свойства триггера терпит неудачу, если свойство target уже имеет явное значение
Вот XAML из тестового приложения:
<Window x:Class="Widgets.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Window.Resources>
<Style x:Key="borderStyle" TargetType="Border">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background">
<Setter.Value>
<SolidColorBrush Color="#CC0000"/>
</Setter.Value>
</Setter>
</Trigger>
</Style.Triggers>
</Style>
<ControlTemplate x:Key="closeButtonTemplate" TargetType="Button">
<Border Width="12" Height="12" CornerRadius="6"
BorderBrush="#AAAAAA" Background="Transparent"
Style="{StaticResource borderStyle}"
ToolTip="Close">
<Viewbox Margin="2.75">
<Path Data="M 0,0 L 10,10 M 0,10 L 10,0" Stroke="{Binding BorderBrush, RelativeSource={RelativeSource FindAncestor, AncestorType=Border, AncestorLevel=1}}" StrokeThickness="1.8"/>
</Viewbox>
</Border>
</ControlTemplate>
</Window.Resources>
<Grid Background="White">
<Button Template="{StaticResource closeButtonTemplate}"/>
</Grid>
</Window>
Обратите внимание, что круговой фон есть всегда - это просто прозрачны, когда мышь не над ним.
Проблема в том, что триггер не работает. Ничего не меняется при появлении кнопки. Однако, если я удаляю значение Background="Transparent"
из объекта Border
в ControlTemplate
, триггер выполняет (хотя и только в случае «Х»).
Я действительно не могу это объяснить. Сети для любых других свойств, размещенных в ресурсе borderStyle
, работают нормально, но сеттер Background
терпит неудачу, как только фон по умолчанию указан в ControlTemplate
.
Любые идеи, почему это происходит и как я могу это исправить? Я знаю, что я мог бы легко заменить этот код, например, на .PNG-образ, но я хочу понять, почему текущая реализация не работает.
Спасибо! :)
Ничего себе, это работает - спасибо! Интересно, как я никогда раньше не сталкивался с этим. У вас есть ссылка (например, статья MSDN), которая описывает это ограничение стилей? –
Не то, что я знаю, но это происходит здесь довольно часто. :) –
Нашел ссылку на MSDN: http://msdn.microsoft.com/en-us/library/ms743230.aspx#multiple_sets –