2016-12-02 3 views
1

У меня есть стиль WPF, который является границей. Он используется для кнопки.Как правильно настроить WPF EventTrigger в стиле?

<Style x:Key="RoundCorner" TargetType="{x:Type Button}"> 
    <Setter Property="ClickMode" Value="Press"/> 
    <EventSetter Event="PreviewMouseUp" Handler="RegularButtonRelease"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type Button}"> 
       <Grid x:Name="grid"> 
        <Border x:Name="border" CornerRadius="2" BorderBrush="#FF444444" BorderThickness="1"> 
         <Border.Background> 
          <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1.2" > 
           <GradientStop Color="#ffaaaaaa" Offset="0" /> 
           <GradientStop Color="White" Offset="1" /> 
          </LinearGradientBrush>        
         </Border.Background> 
        </Border> 
       </Grid> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsPressed" Value="True"> 
         <!--some style --> 
        </Trigger> 
        <Trigger Property="IsMouseOver" Value="True"> 
         <!--some style -->         
        </Trigger> 
        <EventTrigger RoutedEvent="PreviewMouseLeftButtonUp"> 
         <BeginStoryboard> 
          <Storyboard Duration="0:0:2" AutoReverse="False"> 
           <ColorAnimation 
            Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)" 
            FillBehavior="Stop" To="Tomato"/> 
          </Storyboard> 
         </BeginStoryboard> 
        </EventTrigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Я хочу установить цвет фона рамки для другого в течение заданного времени, когда я отпущу кнопку мыши на кнопке. (например, при нажатии на кнопку черный, и когда я отпускаю ее, она меняется на красный), а затем меняет цвет на белый).

Используя приведенный выше код, я вижу, что цвет кнопки меняется после отпускания кнопки мыши, и мой обработчик события RegularButtonRelease также запускается непрерывно. Скоро аппликация висит, и дает мне исключение System.StackOverflowException .

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

Вопрос: как я мог правильно установить изменение цвета фона при помощи кнопки мыши (используя EventTrigger или что-то еще)?

UPDATE:

Я пытаюсь установить границу и фон, в то же время с помощью:

<ColorAnimation 
    Duration="0:0:0.8" 
    Storyboard.TargetName="border" 
    Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)" 
    To="Red"/> 
<ColorAnimation 
    Duration="0:0:0.8" 
    Storyboard.TargetName="border" 
    Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)" 
    To="Red"/> 

На этот раз граница меняется на красный, работает как шарм. Но фон все еще сидит там, никаких изменений.

Как правильно изменить фон?

+0

Добавьте эту строку в файл 'Triggers' тегу -' ' –

ответ

2

Во-первых, ваши ошибки: Вы пытаетесь изменить ColorBackground из которых не возможно, как это установлено в LinearGradientBrush, а во-вторых, вы не установили Storyboard.TargetName вообще.

Я сделал некоторые изменения, первое: Назначают x:Name ко второму GradientStop, а затем использовать эту x:Name, как Storyboard.TargetName="C2" в анимации.

<Style x:Key="RoundCorner" TargetType="{x:Type Button}"> 
     <Setter Property="ClickMode" Value="Press"/> 
     <EventSetter Event="PreviewMouseUp" Handler="RegularButtonRelease"/> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type Button}"> 
        <Grid x:Name="grid"> 
         <Border x:Name="border" CornerRadius="2" BorderBrush="#FF444444" BorderThickness="1"> 
          <Border.Background> 
           <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1.2" > 
            <GradientStop Color="#ffaaaaaa" Offset="0" /> 
            <GradientStop x:Name="C2" Color="White" Offset="1" /> 
           </LinearGradientBrush> 
          </Border.Background> 
         </Border> 
        </Grid> 
        <ControlTemplate.Triggers> 
         <Trigger Property="IsPressed" Value="True"> 
          <!--some style --> 
         </Trigger> 
         <Trigger Property="IsMouseOver" Value="True"> 
          <!--some style --> 
         </Trigger> 
         <EventTrigger RoutedEvent="PreviewMouseLeftButtonUp"> 
          <BeginStoryboard> 
           <Storyboard Duration="0:0:1" AutoReverse="False"> 
            <ColorAnimation Storyboard.TargetName="C2" 
             Storyboard.TargetProperty="Color" 
             FillBehavior="Stop" To="Red"/> 
           </Storyboard> 
          </BeginStoryboard> 
         </EventTrigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
+0

Спасибо. Ваша модификация отлично работает. – Dia

0

Или попробуйте этот пример:

<ControlTemplate.Triggers> 
      <Trigger Property="IsPressed" Value="True"> 
       <Setter Property="Background" TargetName="Background" Value="Red"/> 
      </Trigger> 
     </ControlTemplate.Triggers> 

Для справки:

Change color of Button when Mouse is over

How do you change Background for a Button MouseOver in WPF?

Coming к System.StackOverflowException части, в соответствии с MSDN вы можете получить StackOverflowExceptions путем создания слишком много большие объекты в стеке, это обычно происходит, потому что ваш код имеет попал в состояние, в котором он вызывает одну и ту же цепочку функций снова и снова. Что-то вроде рекурсии.

+0

Спасибо за комментарий, но мой стиль уже есть' IsPressed' tragger которые изменяют границы задний план. Я хочу иметь другой цвет, когда я освобождаю мышь, в течение ~ 1 секунды. – Dia

+0

Что-то вроде этого в [Pietu1998 answer] (http://stackoverflow.com/a/21113588/5588347)? –

+0

Эх, это мне не помогает.Однако теперь я могу изменить цвет линии границы, только сбой при смене фона. Я отредактировал главный пост. – Dia