如何动态改变wpf选框的方向?

时间:2010-06-16 15:49:11

标签: wpf

我想在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); 
        }
    }

现在我可以在第一次将方向从右向左改变。 但是当我从左到右改变它时,它并没有改变从左到右的选框位置。

1 个答案:

答案 0 :(得分:2)

看起来您遗漏了_storyboard = new Storyboard(),可能位于StartMarqueeing方法的顶部。

从我看来,每次调用StartMarqueeing都会在故事板上添加一个额外的DoubleAnimation,然后重新启动它。因此,所有旧的DoubleAnimations都将被重新创建,看起来它们优先。

每次尝试创建一个新的Storyboard对象,而不仅仅是重新使用它并添加到其子集合中。

<强>更新

哦,现在我看到了问题。你不应该同时设置(Canvas.Left)和(Canvas.Right)。只使用两者中的一个:无论如何,这就是你所需要的,并且使用两者都会给出Canvas冲突的指令。传统上人们使用(Canvas.Left)。我认为这就是Canvas选择的,这就是造成你不对称的原因。

你可能想知道为什么当你不认为你的两个动画同时运行时,我说你正在使用两者。实际上他们这样做:第一个动画运行然后将值保存在动画属性上,直到它被另一个动画移除或撞击。如果第二个动画然后运行并修改不同的属性,它不会碰撞第一个动画,因此第一个动画的值仍然存在。

底线是,只要您使用默认的HandoffBehavior.SnapshotAndReplace,两个动画上使用(Canvas.Left)就应该修复它。