WPF尝试动画绑定前景时出现异常。

huangapple go评论106阅读模式
英文:

WPF Exception when try animating binding foreground

问题

我有这个控件...:

  1. <iconPack:PackIconAlvo
  2. Width="{StaticResource iconSize}"
  3. Height="{StaticResource iconSize}"
  4. HorizontalAlignment="Center"
  5. Foreground="{Binding IsMonitoringButtonActive, Converter={StaticResource IsSelectedToColorConverter}}"
  6. Kind="Monitoring"
  7. Style="{StaticResource AlarmAnimation}" />

...使用了这个转换器...:

  1. public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
  2. {
  3. return (bool)value ? new SolidColorBrush(Color.FromRgb(0, 255, 161)) : new SolidColorBrush(Color.FromRgb(131, 131, 131));
  4. }

...和这个动画样式:

  1. <Style x:Key="AlarmAnimation">
  2. <Style.Triggers>
  3. <DataTrigger Binding="{Binding IsAlarmForMonitoringButton}" Value="True">
  4. <DataTrigger.EnterActions>
  5. <BeginStoryboard>
  6. <Storyboard>
  7. <ColorAnimation
  8. AutoReverse="True"
  9. RepeatBehavior="Forever"
  10. Storyboard.TargetProperty="Foreground.(SolidColorBrush.Color)"
  11. From="Gray"
  12. To="Red"
  13. Duration="0:0:0.5" />
  14. </Storyboard>
  15. </BeginStoryboard>
  16. </DataTrigger.EnterActions>
  17. </DataTrigger>
  18. </Style.Triggers>
  19. </Style>

当我启动动画(IsAlarmForMonitoringButton == true)并且 IsMonitoringButtonActive == false 时,我遇到了错误:

无法在不可变对象实例上执行动画 'Foreground.(0)'。

我无法解决这个错误。在这个应用程序中,前景是可变的很重要,当IsAlarmForMonitoringButton==true时它也很重要。

如何处理这个问题?

英文:

I have this control…:

  1. &lt;iconPack:PackIconAlvo
  2. Width=&quot;{StaticResource iconSize}&quot;
  3. Height=&quot;{StaticResource iconSize}&quot;
  4. HorizontalAlignment=&quot;Center&quot;
  5. Foreground=&quot;{Binding IsMonitoringButtonActive, Converter={StaticResource IsSelectedToColorConverter}}&quot;
  6. Kind=&quot;Monitoring&quot;
  7. Style=&quot;{StaticResource AlarmAnimation}&quot; /&gt;

…with this converter…:

  1. public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
  2. {
  3. return (bool)value ? new SolidColorBrush(Color.FromRgb(0, 255, 161)) : new SolidColorBrush(Color.FromRgb(131, 131, 131));
  4. }

…and this animation style:

  1. &lt;Style x:Key=&quot;AlarmAnimation&quot;&gt;
  2. &lt;Style.Triggers&gt;
  3. &lt;DataTrigger Binding=&quot;{Binding IsAlarmForMonitoringButton}&quot; Value=&quot;True&quot;&gt;
  4. &lt;DataTrigger.EnterActions&gt;
  5. &lt;BeginStoryboard&gt;
  6. &lt;Storyboard&gt;
  7. &lt;ColorAnimation
  8. AutoReverse=&quot;True&quot;
  9. RepeatBehavior=&quot;Forever&quot;
  10. Storyboard.TargetProperty=&quot;Foreground.(SolidColorBrush.Color)&quot;
  11. From=&quot;Gray&quot;
  12. To=&quot;Red&quot;
  13. Duration=&quot;0:0:0.5&quot; /&gt;
  14. &lt;/Storyboard&gt;
  15. &lt;/BeginStoryboard&gt;
  16. &lt;/DataTrigger.EnterActions&gt;
  17. &lt;/DataTrigger&gt;
  18. &lt;/Style.Triggers&gt;
  19. &lt;/Style&gt;

When I start animation (IsAlarmForMonitoringButton == true) and IsMonitoringButtonActive == false, then I have error:

> Cannot animate 'Foreground.(0)' on an immutable object instance.

I can't deal with this error. It is important in this application that the foreground is variable, it is also important that it is animated when IsAlarmForMonitoringButton==true.

How can I handle this problem?

答案1

得分: 2

使用Style而不是使用绑定表达式和转换器来设置Foreground属性,例如:

  1. <iconPack:PackIconAlvo
  2. Width="{StaticResource iconSize}"
  3. Height="{StaticResource iconSize}"
  4. HorizontalAlignment="Center"
  5. Kind="Monitoring">
  6. <iconPack:PackIconAlvo.Style>
  7. <Style TargetType="iconPack:PackIconAlvo">
  8. <Setter Property="Foreground" Value="Yellow" />
  9. <Style.Triggers>
  10. <DataTrigger Binding="{Binding IsMonitoringButtonActive}" Value="True">
  11. <Setter Property="Foreground" Value="Red" />
  12. </DataTrigger>
  13. <DataTrigger Binding="{Binding IsAlarmForMonitoringButton}" Value="True">
  14. <DataTrigger.EnterActions>
  15. <BeginStoryboard>
  16. <Storyboard>
  17. <ColorAnimation
  18. AutoReverse="True"
  19. RepeatBehavior="Forever"
  20. Storyboard.TargetProperty="Foreground.(SolidColorBrush.Color)"
  21. From="Gray"
  22. To="Red"
  23. Duration="0:0:0.5" />
  24. </Storyboard>
  25. </BeginStoryboard>
  26. </DataTrigger.EnterActions>
  27. </DataTrigger>
  28. </Style.Triggers>
  29. </Style>
  30. </iconPack:PackIconAlvo.Style>
  31. </iconPack:PackIconAlvo>

另一种选项是以编程方式应用动画。

英文:

Set the Foreground property using a Style instead of using a binding expression and a converter, e.g.:

  1. &lt;iconPack:PackIconAlvo
  2. Width=&quot;{StaticResource iconSize}&quot;
  3. Height=&quot;{StaticResource iconSize}&quot;
  4. HorizontalAlignment=&quot;Center&quot;
  5. Kind=&quot;Monitoring&quot;&gt;
  6. &lt;iconPack:PackIconAlvo.Style&gt;
  7. &lt;Style TargetType=&quot;iconPack:PackIconAlvo&quot;&gt;
  8. &lt;Setter Property=&quot;Foreground&quot; Value=&quot;Yellow&quot; /&gt;
  9. &lt;Style.Triggers&gt;
  10. &lt;DataTrigger Binding=&quot;{Binding IsMonitoringButtonActive}&quot; Value=&quot;True&quot;&gt;
  11. &lt;Setter Property=&quot;Foreground&quot; Value=&quot;Red&quot; /&gt;
  12. &lt;/DataTrigger&gt;
  13. &lt;DataTrigger Binding=&quot;{Binding IsAlarmForMonitoringButton}&quot; Value=&quot;True&quot;&gt;
  14. &lt;DataTrigger.EnterActions&gt;
  15. &lt;BeginStoryboard&gt;
  16. &lt;Storyboard&gt;
  17. &lt;ColorAnimation
  18. AutoReverse=&quot;True&quot;
  19. RepeatBehavior=&quot;Forever&quot;
  20. Storyboard.TargetProperty=&quot;Foreground.(SolidColorBrush.Color)&quot;
  21. From=&quot;Gray&quot;
  22. To=&quot;Red&quot;
  23. Duration=&quot;0:0:0.5&quot; /&gt;
  24. &lt;/Storyboard&gt;
  25. &lt;/BeginStoryboard&gt;
  26. &lt;/DataTrigger.EnterActions&gt;
  27. &lt;/DataTrigger&gt;
  28. &lt;/Style.Triggers&gt;
  29. &lt;/Style&gt;
  30. &lt;/iconPack:PackIconAlvo.Style&gt;
  31. &lt;/iconPack:PackIconAlvo&gt;

The other option is to apply the animation programmatically.

huangapple
  • 本文由 发表于 2023年4月4日 16:16:38
  • 转载请务必保留本文链接:https://go.coder-hub.com/75927012.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定