C# wpf动画——鼠标按下事件不发生';行不通
每次都有一个蓝色矩形从窗口的左侧向右移动不同的距离 单击矩形或动画完成后,矩形将再次从左侧开始移动 如果单击矩形,其颜色将变为绿色,持续时间为0.3秒 但是MouseDown事件似乎并没有启动彩色动画,矩形的移动距离/持续时间也不正确C# wpf动画——鼠标按下事件不发生';行不通,c#,wpf,animation,mousedown,coloranimation,C#,Wpf,Animation,Mousedown,Coloranimation,每次都有一个蓝色矩形从窗口的左侧向右移动不同的距离 单击矩形或动画完成后,矩形将再次从左侧开始移动 如果单击矩形,其颜色将变为绿色,持续时间为0.3秒 但是MouseDown事件似乎并没有启动彩色动画,矩形的移动距离/持续时间也不正确 private int i; private Storyboard hitTargetStoryboard; private List<double> disList; private void Window_Loaded(object sender
private int i;
private Storyboard hitTargetStoryboard;
private List<double> disList;
private void Window_Loaded(object sender, RoutedEventArgs e)
{
disList = new List<double>{.......}; // init with a list of values.
/* Create a rectangle */
Rectangle rect = new Rectangle();
this.RegisterName("rect", rect);
rect.Height = this.ActualHeight;
rect.Width = 50;
Canvas.SetTop(rect, 0);
Canvas.SetLeft(rect, 0);
/* Fill rect with a solid brush */
SolidColorBrush targetRectBrush = new SolidColorBrush(Colors.Blue);
this.RegisterName("targetRectBrush", targetRectBrush);
rect.Fill = targetRectBrush;
/* Add mouse down event */
rect.MouseDown += Rect_MouseDown;
/* Add rect to Canvas */
myCanvas.Children.Add(rect);
/* Create ColorAnimation to change color smoothly */
ColorAnimation hitCA = new ColorAnimation();
hitCA.To = Colors.Green;
hitCA.Duration = TimeSpan.FromSeconds(0.3);
hitCA.Completed += HitCA_Completed;
/* Create storyboard and add ColorAnimation to it */
hitTargetStoryboard = new Storyboard();
Storyboard.SetTargetName(hitCA, "targetRectBrush");
Storyboard.SetTargetProperty(hitCA, new PropertyPath(SolidColorBrush.ColorProperty));
hitTargetStoryboard.Children.Add(hitCA);
i = 0;
TargetAnimation(i);
}
/* move the rect from 0--disList[i] */
private void TargetAnimation(int i)
{
(this.FindName("rect") as Rectangle).Fill = Brushes.Blue;
DoubleAnimation da = new DoubleAnimation();
da.From = 0;
da.To = disList[i];
da.Duration = TimeSpan.FromSeconds(5);
Storyboard.SetTargetName(da, "rect");
Storyboard.SetTargetProperty(da, new PropertyPath(Canvas.LeftProperty));
Storyboard storyboard = new Storyboard();
storyboard.Children.Add(da);
storyboard.Completed += Storyboard_Completed;
storyboard.Begin(this);
}
/* If rect clicked, it will change color to green */
private void Rect_MouseDown(object sender, MouseButtonEventArgs e)
{
hitTargetStoryboard.Begin(this);
}
/* After color changed, rect starts over */
private void HitCA_Completed(object sender, EventArgs e)
{
TargetAnimation(++i);
}
/* If rect not clicked, it will start over */
private void Storyboard_Completed(object sender, EventArgs e)
{
TargetAnimation(++i);
}
privateinti;
私人故事板hitTargetStoryboard;
私人名单;
已加载私有无效窗口(对象发送器、路由目标)
{
disList=新列表{……};//使用值列表初始化。
/*创建一个矩形*/
矩形rect=新矩形();
这个注册表名(“rect”,rect);
垂直高度=此实际高度;
矩形宽度=50;
Canvas.SetTop(rect,0);
Canvas.SetLeft(rect,0);
/*用实心笔刷填充矩形*/
SolidColorBrush targetRectBrush=新的SolidColorBrush(Colors.Blue);
此.RegisterName(“targetRectBrush”,targetRectBrush);
rect.Fill=targetRectBrush;
/*添加鼠标按下事件*/
rect.MouseDown+=rect_MouseDown;
/*将rect添加到画布*/
myCanvas.Children.Add(rect);
/*创建ColorAnimation以平滑地更改颜色*/
ColorAnimation hitCA=新的ColorAnimation();
hitCA.To=颜色.绿色;
hitCA.持续时间=时间跨度(0.3秒);
hitCA.Completed+=hitCA_Completed;
/*创建情节提要并向其添加彩色动画*/
hitTargetStoryboard=新故事板();
故事板.SetTargetName(hitCA,“TargetTrustBrush”);
Storyboard.SetTargetProperty(hitCA,新属性路径(SolidColorBrush.ColorProperty));
hitTargetStoryboard.Children.Add(hitCA);
i=0;
目标化(i);
}
/*将rect从0移动到disList[i]*/
私有无效目标化(int i)
{
(此.FindName(“rect”)为矩形);
DoubleAnimation da=新的DoubleAnimation();
da.From=0;
da.To=disList[i];
da.持续时间=从秒开始的时间跨度(5);
故事板.SetTargetName(da,“rect”);
Storyboard.SetTargetProperty(da,新属性路径(Canvas.LeftProperty));
情节提要情节提要=新情节提要();
故事板。儿童。添加(da);
情节提要.已完成+=情节提要\已完成;
故事板。开始(这个);
}
/*如果单击rect,它将变为绿色*/
私有void Rect_MouseDown(对象发送器,MouseButtonEventArgs e)
{
hitTargetStoryboard.开始(此);
}
/*颜色改变后,rect重新开始*/
私有无效HitCA_已完成(对象发送方,事件参数e)
{
目标化(++i);
}
/*如果未单击rect,它将重新开始*/
私有void情节提要_已完成(对象发送方,事件参数e)
{
目标化(++i);
}
更新:
删除:(this.FindName(“rect”)为矩形)
添加:hitCA.From=Colors.Blue
彩色动画效果很好
仍然:
如果我删除Storyboard\u Completed
或HitCA\u Completed
,rect的移动会很顺利。而如果我两者都有,运动就走错了方向
更新2:
编辑:storyboard.Begin(this,true)
在TargetAnimation(inti)
方法中
添加:stroyboard.Stop(this)
inHitCA\u Completed
方法
如果不将isControlAllable
设置为true
,则脚本将无法控制
已解决您的问题在这里:
(this.FindName("rect") as Rectangle).Fill = Brushes.Blue;
首先,将rect
设置为一个字段并直接设置Fill
属性要容易得多:
rect.Fill = Brushes.Blue;
不过,这对你的彩色动画没有帮助。您已经设置了一个动画来使用targetTructBrush
——它不再填充rect
,因为您刚刚替换了它。删除这一行将设置颜色的动画
更新
这里有一个稍微调整过的版本:
public partial class MainWindow
{
private int i;
private Storyboard hitTargetStoryboard;
private List<double> disList;
private Rectangle rect;
public MainWindow()
{
InitializeComponent();
Loaded += Window_Loaded;
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
disList = new List<double> {10, 20, 30, 40, 50, 60, 70, 80, 90, 100 }; // init with a list of values.
/* Create a rectangle */
rect = new Rectangle();
this.RegisterName("rect", rect);
rect.Height = this.ActualHeight;
rect.Width = 50;
Canvas.SetTop(rect, 0);
Canvas.SetLeft(rect, 0);
/* Fill rect with a solid brush */
SolidColorBrush targetRectBrush = new SolidColorBrush(Colors.Blue);
this.RegisterName("targetRectBrush", targetRectBrush);
rect.Fill = targetRectBrush;
/* Add mouse down event */
rect.MouseDown += Rect_MouseDown;
/* Add rect to Canvas */
myCanvas.Children.Add(rect);
/* Create ColorAnimation to change color smoothly */
ColorAnimation hitCA = new ColorAnimation
{
From = Colors.Blue, // (Instead of setting Fill to Blue)
To = Colors.Green,
Duration = TimeSpan.FromSeconds(0.3),
FillBehavior = FillBehavior.Stop, // Returns to Blue
};
hitCA.Completed += HitCA_Completed;
/* Create storyboard and add ColorAnimation to it */
hitTargetStoryboard = new Storyboard();
Storyboard.SetTargetName(hitCA, "targetRectBrush");
Storyboard.SetTargetProperty(hitCA, new PropertyPath(SolidColorBrush.ColorProperty));
hitTargetStoryboard.Children.Add(hitCA);
i = 0;
TargetAnimation(i);
}
/* move the rect from 0--disList[i] */
private void TargetAnimation(int i)
{
i = i % disList.Count; // Don't overflow
DoubleAnimation da = new DoubleAnimation
{
From = 0,
To = disList[i],
Duration = TimeSpan.FromSeconds(5),
};
Storyboard.SetTargetName(da, "rect");
Storyboard.SetTargetProperty(da, new PropertyPath(Canvas.LeftProperty));
Storyboard storyboard = new Storyboard();
storyboard.Children.Add(da);
storyboard.Completed += Storyboard_Completed;
storyboard.Begin(this);
}
/* If rect clicked, it will change color to green */
private void Rect_MouseDown(object sender, MouseButtonEventArgs e)
{
hitTargetStoryboard.Begin(this);
}
/* After color changed, rect starts over */
private void HitCA_Completed(object sender, EventArgs e)
{
TargetAnimation(++i);
}
/* If rect not clicked, it will start over */
private void Storyboard_Completed(object sender, EventArgs e)
{
TargetAnimation(++i);
}
}
公共部分类主窗口
{
私人互联网i;
私人故事板hitTargetStoryboard;
私人名单;
私有矩形矩形;
公共主窗口()
{
初始化组件();
加载+=窗口加载;
}
已加载私有无效窗口(对象发送器、路由目标)
{
disList=新列表{10,20,30,40,50,60,70,80,90,100};//使用值列表初始化。
/*创建一个矩形*/
rect=新矩形();
这个注册表名(“rect”,rect);
垂直高度=此实际高度;
矩形宽度=50;
Canvas.SetTop(rect,0);
Canvas.SetLeft(rect,0);
/*用实心笔刷填充矩形*/
SolidColorBrush targetRectBrush=新的SolidColorBrush(Colors.Blue);
此.RegisterName(“targetRectBrush”,targetRectBrush);
rect.Fill=targetRectBrush;
/*添加鼠标按下事件*/
rect.MouseDown+=rect_MouseDown;
/*将rect添加到画布*/
myCanvas.Children.Add(rect);
/*创建ColorAnimation以平滑地更改颜色*/
ColorAnimation hitCA=新的ColorAnimation
{
From=Colors.Blue,//(而不是将Fill设置为Blue)
To=颜色。绿色,
持续时间=从秒开始的时间跨度(0.3),
FillBehavior=FillBehavior.Stop,//返回蓝色
};
hitCA.Completed+=hitCA_Completed;
/*创建情节提要并向其添加彩色动画*/
hitTargetStoryboard=新故事板();
故事板.SetTargetName(hitCA,“TargetTrustBrush”);
Storyboard.SetTargetProperty(hitCA,新属性路径(SolidColorBrush.ColorProperty));
hitTargetStoryboard.Children.Add(hitCA);
i=0;
目标化(i);
}
/*将rect从0移动到disList[i]*/
私有无效目标化(int i)
{
i=i%disList.Count;//不要溢出