1

Я настраиваю элемент управления WPF GroupBox. Мне нужно реализовать цветную анимацию для своего фона, когда указатель мыши входит в область управления - скажем, медленно меняйте цвет фона на предопределенный цвет (пусть он будет розовым). Я создал для него настраиваемый шаблон управления, и его существенная часть выглядит так:InvalidOperationException для ColorAnimation для WPF Grid.Background внутри ControlTemplate

<ControlTemplate TargetType="{x:Type GroupBox}"> 
    <Grid Name="MainGrid" SnapsToDevicePixels="true"> 
     <!-- Control layout stuff with ContentPresenter --> 
    </Grid> 

    <ControlTemplate.Triggers> 
     <EventTrigger RoutedEvent="MouseEnter"> 
      <BeginStoryboard> 
       <Storyboard> 
        <ColorAnimation 
         Storyboard.TargetName="MainGrid" 
         Storyboard.TargetProperty="Background.(SolidColorBrush.Color)" 
         To="Pink" Duration="0:0:1" /> 
       </Storyboard> 
      </BeginStoryboard> 
     </EventTrigger> 
    </ControlTemplate.Triggers> 
</ControlTemplate> 

Однако я не могу заставить эту анимацию работать. Я всегда получаю необработанное исключение типа:

«System.InvalidOperationException» произошло в PresentationFramework.dll с дополнительной информацией как это:. свойство «Background» не указывает на DependencyObject в пути «Background (0) '

Я столкнулся с этой проблемой. Кажется, мне нужно использовать правильный синтаксис для анимации TargetProperty. Тем не менее, я пробовал много вариантов, как следующие из них и все они не работают в моем случае:

  • Background.Color
  • (Panel.Background).Color
  • (Panel.Background).(SolidColorBrush.Color)

Могу ли я искать не в правильном направлении?

+0

Просто используйте 'TargetProperty = Background' должен работать. Если он не распознает «Розовый» в качестве кисти, вам может понадобиться использовать «StaticResource» для этого, но afaik он должен работать с именем в одиночку, поскольку это предопределенное имя цвета. – Adwaenyth

+0

@Adwaenyth, конечно, это не сработает. Дополнительная информация: объект анимации «System.Windows.Media.Animation.ColorAnimation» не может использоваться для анимации свойства «Фон», поскольку он имеет несовместимый тип «System.Windows.Media.Brush». – TecMan

+0

Mh ... попробуйте как «Storyboard.TargetProperty = (GroupBox.Background). (SolidColorBrush.Color)», работает ли это тогда как отмечено [здесь] (http://stackoverflow.com/questions/14158500/wpf-animate -фоновый цвет)? – Adwaenyth

ответ

1

Ваш TargetElement нуждается в исходном сеттере в своем стиле, чтобы заставить анимацию работать.

Пример

<GroupBox> 
     <GroupBox.Style> 
      <Style TargetType="GroupBox"> 
       <Style.Setters> 
        <Setter Property="Template"> 
         <Setter.Value> 
          <ControlTemplate TargetType="{x:Type GroupBox}"> 
           <Grid Name="MainGrid" SnapsToDevicePixels="true"> 
            <Grid.Style> 
             <Style TargetType="Grid"> 
              <Setter Property="Background" Value="Blue"></Setter> 
             </Style> 
            </Grid.Style> 
            <ContentPresenter/> 
           </Grid> 
           <ControlTemplate.Triggers> 
            <EventTrigger RoutedEvent="MouseEnter"> 
             <BeginStoryboard> 
              <Storyboard> 
               <ColorAnimation Storyboard.TargetName="MainGrid" Storyboard.TargetProperty="Background.Color" To="Pink" Duration="0:0:1" /> 
              </Storyboard> 
             </BeginStoryboard> 
            </EventTrigger> 
           </ControlTemplate.Triggers> 
          </ControlTemplate> 
         </Setter.Value> 
        </Setter> 
       </Style.Setters> 
      </Style> 
     </GroupBox.Style> 
     <Button Content="test" Width="200" Height="50"></Button> 
    </GroupBox> 

После этого, вы можете легко использовать Storyboard.TargetProperty="Background.Color"

+0

Да, действительно, и я даже подумал об этом: как ColorAnimation умеет анимировать от не заданного цвета до розового? Тем не менее, мне нужно сделать это универсальным способом, то есть без установки предопределенного цвета для основной сетки макета. Есть ли способ реализовать это? – TecMan

+0

BTW, даже простая настройка свойств в узле Grid помогает: ''. – TecMan

+0

Вы можете определить фон по умолчанию для сетки. Встроенное значение по умолчанию должно быть прозрачным или белым. Просто установите его снова, и у вас будет более общий подход. – lokusking

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