Wpf 无法在不可变对象上设置(0)。(1)的动画?

Wpf 无法在不可变对象上设置(0)。(1)的动画?,wpf,xaml,animation,combobox,themes,Wpf,Xaml,Animation,Combobox,Themes,我有一个带有我编写的自定义主题的组合框,我收到错误消息“无法在不可变对象上设置动画(0)。(1)。”当用户选择组合框中的一个选项后,我设置其selectedindex时,尤其会发生这种情况 我在网上做了一些研究,发现这是数据绑定项或动态资源的常见问题。我没有使用任何数据绑定资源,但我认为正在发生的是,由于组合框已折叠,它尝试设置不存在的按钮的状态。我把范围缩小到以下代码: <ControlTemplate.Triggers> <Trigger Property="IsSel

我有一个带有我编写的自定义主题的组合框,我收到错误消息“无法在不可变对象上设置动画(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 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;

这取决于这些动态资源:

<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>


所以我很确定这些动态资源是罪魁祸首,但是我该如何解决这个问题呢?

在通过比较代码和文件来调试它之后,我发现将控件使用的所有资源传输到文件本身,并将所有
DynamicResources
替换为
StaticResources
,从而修复了我的错误。

请确保这两个(
spOverStateBrush
spPressedStateBrush
)笔刷未在代码中的不同位置使用

为了能够设置动画,边框的背景笔刷(
spOverStateBrush
spPressedStateBrush
)必须是可变的,默认值不是

如果在其他位置使用这两个笔刷中的一个,则应在设置类似以下代码的动画之前指定一个新的LinearGradientBrush:

<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 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;

你把代码缩得太窄了一点。请多给我们看看。把你的项目上传到网上某个地方。这些都是触发器,动画在哪里?@devhedgehog-oops我说动画是偶然的,它们不是动画,它们是即时的,我会更新问题你能显示完整的代码吗?我有一个触发器可以很好地设置动态资源。