我有一个带有我编写的自定义主题的ComboBox,并且在不可变对象上收到错误消息“Can not animate(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>
所以我很确定这些动态资源是罪魁祸首,但我该如何解决这个问题呢?
答案 0 :(得分:1)
通过将代码与original Control Template进行比较,经过艰苦尝试调试后,我发现将我的控件使用的所有资源都传输到文件本身,并用{{替换所有DynamicResources
1}}并修复了我遇到的错误。
答案 1 :(得分: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;