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

问题描述 投票:0回答:3

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

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

wpf xaml animation combobox themes
3个回答
1
投票

通过将代码与原始控件模板进行比较,煞费苦心地尝试对其进行调试后,我发现将控件使用的所有资源传输到文件本身中,并将所有

DynamicResources
替换为
StaticResources
,然后修复了我遇到的错误。


0
投票

确保这两个(

spOverStateBrush
spPressedStateBrush
)画笔没有在代码中的不同位置使用。

为了实现动画效果,

spOverStateBrush
的背景画笔(spPressedStateBrush
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;

0
投票

我刚刚弄清楚了这一点,在我的例子中,我试图为我用

Brushes.DarkRed
设置的 TextBlock 上的前景画笔设置动画。 这些画笔是不可变的。 你必须给它一个
new SolidColorBrush(Colors.DarkRed)

© www.soinside.com 2019 - 2024. All rights reserved.