不能不可变对象的动画(0)(1)?(Cannot animate (0).(1) on an imm

2019-10-19 07:07发布

I“不可变对象不能动画(0)(1)。”有一个自定义的主题,我写了一个组合框,我得到的错误信息 这特别发生在我设置其selectedindex用户选择的在组合框中的选项之一之后。

在网上做了一些研究,我发现,这是数据绑定的物品或动态资源的共同课题。 我没有使用任何数据绑定的资源,但我认为正在发生的事情是,因为组合框处于折叠状态,它会尝试设置不存在的按钮的状态。 我把范围缩小到这样的代码:

<ControlTemplate.Triggers>
  <Trigger Property="IsSelected" Value="True">
     <Setter TargetName="Border" Property="Background" Value="{DynamicResource spPressedStateBrush}" />
  </Trigger>
  <Trigger Property="IsMouseOver" Value="True">
     <Setter TargetName="Border" Property="Background" Value="{DynamicResource spOverStateBrush}" />
  </Trigger>
</ControlTemplate.Triggers>

这取决于这些动态的资源:

<LinearGradientBrush x:Key="spOverStateBrush" StartPoint="0,0" EndPoint="0,1">
    <GradientStop Color="#2C8CBF" Offset="0" />
    <GradientStop Color="#2793BF" Offset="0.5" />
    <GradientStop Color="#2483BF" Offset="0.5001" />
    <GradientStop Color="#2C8CBF" Offset="1" />
</LinearGradientBrush>

<LinearGradientBrush x:Key="spPressedStateBrush" StartPoint="0,0" EndPoint="0,1">
    <GradientStop Color="#0C6C9F" Offset="0" />
    <GradientStop Color="#07739F" Offset="0.5" />
    <GradientStop Color="#04639F" Offset="0.5001" />
    <GradientStop Color="#0C6C9F" Offset="1" />
</LinearGradientBrush>

所以我敢肯定,这些动态的资源是罪魁祸首,但我会如何解决这个问题?

Answer 1:

苦心想通过代码比较的调试后,它原有的控制模板 ,我想通了,运输所有我的控制使用到文件本身的资源,并更换所有DynamicResourcesStaticResources和固定我是有错误。



Answer 2:

确保这两个两( spOverStateBrushspPressedStateBrush )刷子没有在你的代码在不同的地方使用。

为了动画,背景刷( spOverStateBrushspPressedStateBrush所述的) Border必须是可变的,其中所述默认值是没有的。

如果您在另一个地方使用这两个刷之一,您应该动画这样的代码之前分配一个新的一个LinearGradientBrush:

    LinearGradientBrush gradient = new LinearGradientBrush();
    gradient.StartPoint = new Point( 0.5, 0 );
    gradient.EndPoint = new Point( 0.5, 1 );

    gradient.GradientStops.Add(new GradientStop(Colors.Black, 0));
    gradient.GradientStops.Add(new GradientStop(Color.FromArgb(100,69,87,186), 1));

    Border.Background = gradient;


文章来源: Cannot animate (0).(1) on an immutable object?