Как динамически изменить направление выделения wpf? - PullRequest
0 голосов
/ 16 июня 2010

Я хочу изменить направление моего выделения при нажатии кнопки 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 Ответ

2 голосов
/ 17 июня 2010

Похоже, вы пропустили _storyboard = new Storyboard(), возможно, на вершине StartMarqueeing метода.

Из того, что я вижу, видно, что каждый вызов StartMarqueeing добавляет дополнительную DoubleAnimation к раскадровке, а затем запускает ее снова. Таким образом, все старые DoubleAnimations будут воссозданы, и, похоже, они имеют приоритет.

Попробуйте каждый раз создавать новый объект Storyboard, а не просто повторно использовать его и добавлять в дочернюю коллекцию.

Обновление

О, теперь я вижу проблему. Вы не должны устанавливать оба параметра (Canvas.Left) и (Canvas.Right). Используйте только одно из двух: это все, что вам нужно в любом случае, и использование обоих даст Canvas противоречивые инструкции. Традиционно люди используют (Canvas.Left). Я думаю, что это то, что выбирает Canvas, и это вызывает асимметрию.

Вы можете удивиться, почему я говорю, что вы используете оба, когда вы не думаете, что ваши две анимации запускаются одновременно. На самом деле они делают: первая анимация запускается, затем сохраняет значение анимированного свойства, пока оно не будет удалено или удалено другой анимацией. Если вторая анимация затем запускается и изменяет другое свойство, она не затрагивает первую анимацию, поэтому значение первой анимации все еще присутствует.

Суть в том, что использование (Canvas.Left) на обеих анимациях должно исправить это, если вы используете по умолчанию HandoffBehavior.SnapshotAndReplace.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...