C# 产生用户控制脉冲
我想做的是让我的控制“脉冲”(比如放大一点,然后缩小一点,然后恢复到正常大小)。下面的代码正是我想要的,但似乎应该有一种更简单的方法。它必须在代码隐藏中完成,因为这是一个抽象类,我们的大多数控件都是从这个抽象类派生的。我对动画控件和故事板没有太多经验 因此,我的问题是,有没有比下面的方法更简单的方法来获得所需的结果(同时仍然在代码隐藏中完成)C# 产生用户控制脉冲,c#,wpf,animation,code-behind,C#,Wpf,Animation,Code Behind,我想做的是让我的控制“脉冲”(比如放大一点,然后缩小一点,然后恢复到正常大小)。下面的代码正是我想要的,但似乎应该有一种更简单的方法。它必须在代码隐藏中完成,因为这是一个抽象类,我们的大多数控件都是从这个抽象类派生的。我对动画控件和故事板没有太多经验 因此,我的问题是,有没有比下面的方法更简单的方法来获得所需的结果(同时仍然在代码隐藏中完成) 这是一种很好的方法,WPF不提供自动脉冲的方法或事件。您的方法很简单,在创建它时,您知道如何根据自己的意愿修改它。您可以通过将增长/收缩逻辑移动到自己的方
这是一种很好的方法,WPF不提供自动脉冲的方法或事件。您的方法很简单,在创建它时,您知道如何根据自己的意愿修改它。您可以通过将增长/收缩逻辑移动到自己的方法中来简化一些事情。这减少了重复,并提供了潜在的更可重用的代码kibble
public void Pulse()
{
var storyboard = new Storyboard
{
FillBehavior = FillBehavior.Stop,
RepeatBehavior = new RepeatBehavior(2)
};
double timeIncrement = .15;
double growPercent = 20;
double shrinkPercent = -20;
var firstTime = TimeSpan.FromSeconds(timeIncrement);
var secondTime = TimeSpan.FromSeconds(timeIncrement * 3);
var thirdTime = TimeSpan.FromSeconds(timeIncrement * 4);
var scale = new ScaleTransform(1.0, 1.0);
RenderTransformOrigin = new Point(.5, .5);
RenderTransform = scale;
storyboard = AddSizeChange(firstTime, growPercent, storyboard);
storyboard = AddSizeChange(secondTime, shrinkPercent, storyboard);
storyboard = AddSizeChange(thirdTime, growPercent, storyboard);
BeginStoryboard(storyboard, HandoffBehavior.SnapshotAndReplace, false);
}
public Storyboard AddSizeChange(TimeSpan animTime, double changePercent, Storyboard storyboard)
{
DoubleAnimation growX = new DoubleAnimation
{
Duration = animTime,
To = 1 + changePercent
};
storyboard.Children.Add(growX);
Storyboard.SetTargetProperty(growX, new PropertyPath("RenderTransform.ScaleX"));
DoubleAnimation growY = new DoubleAnimation
{
Duration = animTime,
To = 1 + changePercent
};
storyboard.Children.Add(growY);
Storyboard.SetTargetProperty(growY, new PropertyPath("RenderTransform.ScaleY"));
return storyboard;
}
我觉得很简单…好的,谢谢。我认为一定有动画的地方,我错过了,这将使这更简单。
public void Pulse()
{
var storyboard = new Storyboard
{
FillBehavior = FillBehavior.Stop,
RepeatBehavior = new RepeatBehavior(2)
};
double timeIncrement = .15;
double growPercent = 20;
double shrinkPercent = -20;
var firstTime = TimeSpan.FromSeconds(timeIncrement);
var secondTime = TimeSpan.FromSeconds(timeIncrement * 3);
var thirdTime = TimeSpan.FromSeconds(timeIncrement * 4);
var scale = new ScaleTransform(1.0, 1.0);
RenderTransformOrigin = new Point(.5, .5);
RenderTransform = scale;
storyboard = AddSizeChange(firstTime, growPercent, storyboard);
storyboard = AddSizeChange(secondTime, shrinkPercent, storyboard);
storyboard = AddSizeChange(thirdTime, growPercent, storyboard);
BeginStoryboard(storyboard, HandoffBehavior.SnapshotAndReplace, false);
}
public Storyboard AddSizeChange(TimeSpan animTime, double changePercent, Storyboard storyboard)
{
DoubleAnimation growX = new DoubleAnimation
{
Duration = animTime,
To = 1 + changePercent
};
storyboard.Children.Add(growX);
Storyboard.SetTargetProperty(growX, new PropertyPath("RenderTransform.ScaleX"));
DoubleAnimation growY = new DoubleAnimation
{
Duration = animTime,
To = 1 + changePercent
};
storyboard.Children.Add(growY);
Storyboard.SetTargetProperty(growY, new PropertyPath("RenderTransform.ScaleY"));
return storyboard;
}