1

我正在尝试绑定 ColorAnimation TO={Binding Source={StaticResource Test1}, Path=Color}

我可以使用 SolidColorBrush 执行此操作,但在尝试在彩色动画中使用它时出现“System.Windows.Markup.XamlParseException”异常。

这是我所拥有的:

<SolidColorBrush x:Key="Test1" Color="{Binding Source={x:Static self:MySettings.Default}, Path=HighlightColor}"/>
<SolidColorBrush x:Key="Test2" Color="{Binding Source={x:Static self:MySettings.Default}, Path=TextColor}"/>

<Style x:Key="WindowLabel" TargetType="Border" BasedOn="{StaticResource HighlightBorder}">
    <Setter Property="Background" Value="{StaticResource Test2}"/>
    <Setter Property="Height" Value="50"/>
    <Style.Triggers>
        <EventTrigger RoutedEvent="MouseEnter">
            <BeginStoryboard>
                <Storyboard>
                    <ColorAnimation To="{Binding Source={StaticResource Test1}, Path=Color}" 
                                    Duration="{StaticResource AnimSpeed}" 
                                    Storyboard.TargetProperty="Background.Color"/>
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
        <EventTrigger RoutedEvent="MouseLeave">
            <BeginStoryboard>
                <Storyboard>
                    <ColorAnimation To="{Binding Source={StaticResource Test2}, Path=Color}" 
                                    Duration="{StaticResource AnimSpeed}" 
                                    Storyboard.TargetProperty="Background.Color"/>
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </Style.Triggers>
</Style>

Test2 SolidColorBrush 工作正常,那么为什么动画不能呢?

4

1 回答 1

5

问题不在于你如何绑定,而在于你如何绑定。如果你进入内部异常,你会看到这个错误:

无法冻结此 Storyboard 时间线树以供跨线程使用。

这基本上意味着因为Storyboards使用线程,它们以及它们使用的所有东西都需要可冻结而Bindings不是。Storyboard不能使用在动画过程中可能发生变化的动态值。

您可以尝试用 替换SolidColorBrushColor如下所示,但您也可能需要用Duration

<Color  A="255" R="100" G="0" B="0" x:Key="Test1"/>
<Color A="255" R="0" G="100" B="0" x:Key="Test2"/>
...
<Style TargetType="Border">
  <Setter Property="Background">
      <Setter.Value>
          <SolidColorBrush Color="{StaticResource Test2}"/>
      </Setter.Value>
  </Setter>
  <Setter Property="Height" Value="50"/>
  <Style.Triggers>
      <EventTrigger RoutedEvent="MouseEnter">
          <BeginStoryboard>
              <Storyboard>
                  <ColorAnimation To="{StaticResource Test1}"
                  Duration="0:0:1" 
                  Storyboard.TargetProperty="Background.Color"/>
              </Storyboard>
          </BeginStoryboard>
      </EventTrigger>
      <EventTrigger RoutedEvent="MouseLeave">
          <BeginStoryboard>
              <Storyboard>
                  <ColorAnimation To="{StaticResource Test2}" 
                  Duration="0:0:1" 
                  Storyboard.TargetProperty="Background.Color"/>
              </Storyboard>
          </BeginStoryboard>
      </EventTrigger>
  </Style.Triggers>
</Style>
于 2013-06-09T21:24:38.543 回答