Изменение размера элемента управления сеткой в ​​течение определенного периода времени - PullRequest
0 голосов
/ 21 декабря 2010

G'day,

Я пытаюсь смоделировать старый графический интерфейс XBox 360 с помощью скользящих вкладок (Помните, вы нажимаете влево или вправо, и содержимое будет перемещаться в зависимости от вкладки?) В любом случае, в настоящий момент у меня это работает хорошо Однако я не могу заставить работать "анимацию".

Когда пользователь нажимает стрелку влево или вправо, будет вызван мой метод OpenWindow (int iIndex), где iIndex - это индекс следующего или предыдущего «окна», в которое нужно вставить. (Не окно ... каждый «Окно» - это структура с родительским элементом управления сеткой, содержащим кнопку, и меньшим элементом управления сеткой, который содержит содержимое окна.)

Теперь моя проблема заключается в изменении размера элемента управления родительской сетки. Когда он вставляется, его размер изменяется путем вызова mygrid.Width + = 1; Это работает, но я не вижу, чтобы это происходило в течение определенного периода времени, оно просто немного отстает, а затем изменяется до необходимой ширины. Принимая во внимание, что если я вызову this.Width + = 1 в том же методе (это главное окно программы), то окно изменит размер, как я хочу, чтобы размер сетки изменился. Я пробовал UpdateLayout (), но безрезультатно. Это говорит о том, что с моим временем все в порядке.

Если бы кто-нибудь мог помочь, это было бы очень признательно.

Вот мой метод OpenWindow ...

public void OpenWindow(int iIndex)
    {
        int iInterval = 1;
        for (int i = (int)myDict[iIndex].Shell.Width; i < (int)stack_outter.Width; i += iInterval)
        {                
            myDict[iIndex].Shell.Width += 1;
            myDict[iIndex].Shell.UpdateLayout();
            System.Threading.Thread.Sleep(1);                

        }

        myDict[iIndex].Shell.Width = stack_outter.Width - (BUTTON_WIDTH * (myDict.Count - 1));
    }

myDict - это словарь, Shell - это сетка, которую я пытаюсь оживить при изменении размера. Извините за код, он грязный, мой код всегда взламывается, когда я пытаюсь заставить что-то работать:)

Спасибо

Ash

Neried Web Solutions

1 Ответ

0 голосов
/ 21 декабря 2010

Ваш метод OpenWindow происходит в потоке Dispatcher.Это также поток, отвечающий за рендеринг, так что пока ваш метод OpenWindow не вернется, ничто не будет обработано.

Правильный способ исправить это - анимировать свойство Width.У меня нет никакого опыта в запуске анимаций из кода (в прошлом я использовал их только для таких вещей, как подсветка плавной кнопки при наведении мыши, что проще сделать из WPF), но я быстро прочитална этой странице Обзор анимации на MSDN , и я думаю, вы захотите что-то вроде этого:

        DoubleAnimation myDoubleAnimation = new DoubleAnimation();
        myDoubleAnimation.From = myDict[iIndex].Shell.Width;
        myDoubleAnimation.To = stack_outter.Width;
        myDoubleAnimation.Duration = new Duration(TimeSpan.FromSeconds(0.5));
        myDoubleAnimation.AutoReverse = false;
        myDoubleAnimation.RepeatBehavior = new RepeatBehavior(1.0);

        myStoryboard = new Storyboard();
        myStoryboard.Children.Add(myDoubleAnimation);
        Storyboard.SetTarget(myDoubleAnimation, myDict[iIndex].Shell);
        Storyboard.SetTargetProperty(myDoubleAnimation, new PropertyPath(FrameworkElement.WidthProperty));
        myStoryboard.Begin(myDict[iIndex].Shell);
...