2010-06-15 1 views
1

Я сейчас пытаюсь создать 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-образ, но я хочу понять, почему текущая реализация не работает.

Спасибо! :)

ответ

6

Попробуйте переместить explict «фон» назначение внутри декларации границы до самого стиля:

<Style x:Key="borderStyle" TargetType="Border"> 
    <Setter Property="Background" Value="Transparent" /> 

    <Style.Triggers> 
     <Trigger Property="IsMouseOver" Value="True"> 
      <Setter Property="Background"> 
      <Setter.Value> 
       <SolidColorBrush Color="#CC0000"/> 
      </Setter.Value> 
     </Setter> 
    </Trigger> 
</Style.Triggers> 

... 

<Border Width="12" Height="12" CornerRadius="6" 
     BorderBrush="#AAAAAA" 
     Style="{StaticResource borderStyle}" 
     ToolTip="Close"> 

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

+0

Ничего себе, это работает - спасибо! Интересно, как я никогда раньше не сталкивался с этим. У вас есть ссылка (например, статья MSDN), которая описывает это ограничение стилей? –

+0

Не то, что я знаю, но это происходит здесь довольно часто. :) –

+0

Нашел ссылку на MSDN: http://msdn.microsoft.com/en-us/library/ms743230.aspx#multiple_sets –

0

Я думаю, ваша проблема в том, что граница не «поймает» события мыши, когда она прозрачна.

Чтобы проверить - попробуйте изменить фон на # 01FFFFFF вместо прозрачного.

+0

Нет, это не то. Я специально использовал Transparent, потому что он * делает * улавливает события мыши (в отличие от пустой кисти). –

+0

Ahh - пропустил это. – Goblin

 Смежные вопросы

  • Нет связанных вопросов^_^