我想在changeDirection按钮上单击更改选取框的方向。 我改变方向的代码是:
private void changeDirection_click(object sender, RoutedEventArgs e)
{
if (_marqueeType == MarqueeType.RightToLeft)
{
_marqueeType = MarqueeType.LeftToRight;
StartMarqueeing(_marqueeType);
}
else if (_marqueeType == MarqueeType.LeftToRight)
{
_marqueeType = MarqueeType.RightToLeft;
StartMarqueeing(_marqueeType);
}
}
启动选框的代码是:
public void StartMarqueeing(MarqueeType marqueeType)
{
double height = canMain.ActualHeight - marqueeList.ActualHeight;
marqueeList.Margin = new Thickness(0, 0, 0, 0);
doubleAnimation.From = -marqueeList.ActualWidth;
doubleAnimation.To = canMain.ActualWidth;
doubleAnimation.RepeatBehavior = RepeatBehavior.Forever;
doubleAnimation.Duration = new Duration(TimeSpan.FromSeconds(_marqueeTimeInSeconds));
if (marqueeType == MarqueeType.RightToLeft)
{
Storyboard.SetTargetProperty(doubleAnimation, new PropertyPath("(Canvas.Right)"));
_storyBoard.Children.Add(doubleAnimation);
_storyBoard.Begin(marqueeList, true);
}
else if (marqueeType == MarqueeType.LeftToRight)
{
Storyboard.SetTargetProperty(doubleAnimation, new PropertyPath("(Canvas.Left)"));
_storyBoard.Children.Add(doubleAnimation);
_storyBoard.Begin(marqueeList, true);
}
}
现在我可以在第一次将方向从右向左改变。 但是当我从左到右改变它时,它并没有改变从左到右的选框位置。
答案 0 :(得分:2)
看起来您遗漏了_storyboard = new Storyboard()
,可能位于StartMarqueeing
方法的顶部。
从我看来,每次调用StartMarqueeing都会在故事板上添加一个额外的DoubleAnimation,然后重新启动它。因此,所有旧的DoubleAnimations都将被重新创建,看起来它们优先。
每次尝试创建一个新的Storyboard对象,而不仅仅是重新使用它并添加到其子集合中。
<强>更新强>
哦,现在我看到了问题。你不应该同时设置(Canvas.Left)和(Canvas.Right)。只使用两者中的一个:无论如何,这就是你所需要的,并且使用两者都会给出Canvas冲突的指令。传统上人们使用(Canvas.Left)。我认为这就是Canvas选择的,这就是造成你不对称的原因。
你可能想知道为什么当你不认为你的两个动画同时运行时,我说你正在使用两者。实际上他们这样做:第一个动画运行然后将值保存在动画属性上,直到它被另一个动画移除或撞击。如果第二个动画然后运行并修改不同的属性,它不会碰撞第一个动画,因此第一个动画的值仍然存在。
底线是,只要您使用默认的HandoffBehavior.SnapshotAndReplace,两个动画上使用(Canvas.Left)就应该修复它。