C# 从DynamicSource设置边界笔刷动画使用该笔刷为所有内容设置动画
我正在尝试根据一个状态和一个事件为边界着色。我有一个打开和关闭状态,有一个“戳”事件。打开=绿色,关闭=红色,当戳我想从蓝色褪色回其原始颜色(基于其状态)。它们都位于应用程序资源中,并用作DynamicSource 我有一些代码可以做到这一点,但每当我触发Poked事件时,使用对象当前设置的颜色的所有东西都会从蓝色变为该颜色。我怀疑发生的是颜色转换实际上是在应用程序资源中存储的颜色上运行的,而不是在对象的颜色上运行的 我处理动画的方式可能有点不对劲。谢谢你的帮助 MainWindow.xamlC# 从DynamicSource设置边界笔刷动画使用该笔刷为所有内容设置动画,c#,wpf,animation,C#,Wpf,Animation,我正在尝试根据一个状态和一个事件为边界着色。我有一个打开和关闭状态,有一个“戳”事件。打开=绿色,关闭=红色,当戳我想从蓝色褪色回其原始颜色(基于其状态)。它们都位于应用程序资源中,并用作DynamicSource 我有一些代码可以做到这一点,但每当我触发Poked事件时,使用对象当前设置的颜色的所有东西都会从蓝色变为该颜色。我怀疑发生的是颜色转换实际上是在应用程序资源中存储的颜色上运行的,而不是在对象的颜色上运行的 我处理动画的方式可能有点不对劲。谢谢你的帮助 MainWindow.xaml
<Window x:Class="ColorAnimatorIssue.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:ColorAnimatorIssue"
Title="MainWindow"
Height="350"
Width="525"
DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Window.Resources>
<local:StateColorConverter x:Key="ColorConverter"/>
<Storyboard x:Key="Poke1">
<ColorAnimation Storyboard.TargetName="B1"
Storyboard.TargetProperty="(BorderBrush).(SolidColorBrush.Color)"
From="{DynamicResource PokeColor}"
Duration="0:0:2"/>
</Storyboard>
<Storyboard x:Key="Poke2">
<ColorAnimation Storyboard.TargetName="B2"
Storyboard.TargetProperty="BorderBrush.Color"
From="{DynamicResource PokeColor}"
Duration="0:0:2"/>
</Storyboard>
</Window.Resources>
<Grid>
<Button Content="Poke 1" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Margin="7,37,0,0" Click="Poke1_Click"/>
<Button Content="Poke 2" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Margin="87,37,0,0" Click="Poke2_Click"/>
<Border x:Name="B1"
BorderBrush="{Binding MyState1, Converter={StaticResource ColorConverter}}"
BorderThickness="10"
Margin="199,37,217,183">
<Rectangle Height="100" Width="100" Fill="Black"/>
</Border>
<Border x:Name="B2"
BorderBrush="{Binding MyState2, Converter={StaticResource ColorConverter}}"
BorderThickness="10"
Margin="305,37,111,183">
<Rectangle Height="100" Width="100" Fill="Black"/>
</Border>
<Button Content="Toggle 1" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Margin="7,10,0,0" Click="Toggle1_Click" />
<Button Content="Toggle 2" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Margin="87,10,0,0" Click="Toggle2_Click" />
</Grid>
应用程序资源
<Application.Resources>
<Color A="255" R="0" G="255" B="0" x:Key="OnColor"/>
<SolidColorBrush Color="{DynamicResource OnColor}" x:Key="OnBrush"/>
<Color A="255" R="255" G="0" B="0" x:Key="OffColor"/>
<SolidColorBrush Color="{DynamicResource OffColor}" x:Key="OffBrush"/>
<Color A="255" R="0" G="0" B="255" x:Key="PokeColor"/>
</Application.Resources>
尝试在画笔上设置x:Shared=“False”
以强制在每次引用时创建一个单独的实例。成功了!谢谢,我是迈克!
public class StateColorConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
switch((States)value)
{
case States.On:
return Application.Current.FindResource("OnBrush") as Brush;
case States.Off:
return Application.Current.FindResource("OffBrush") as Brush;
default:
return null;
}
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
<Application.Resources>
<Color A="255" R="0" G="255" B="0" x:Key="OnColor"/>
<SolidColorBrush Color="{DynamicResource OnColor}" x:Key="OnBrush"/>
<Color A="255" R="255" G="0" B="0" x:Key="OffColor"/>
<SolidColorBrush Color="{DynamicResource OffColor}" x:Key="OffBrush"/>
<Color A="255" R="0" G="0" B="255" x:Key="PokeColor"/>
</Application.Resources>