c# - "L oop -анимация" через список строк - PullRequest
0 голосов
/ 17 января 2020

Я создаю очень простое C# Приложение WPF. Что приложение делает, так это то, что когда я нажимаю кнопку, оно показывает значение случайным образом из списка строк.

Чего я хотел бы добиться, так это анимации, в которой оно быстро прокручивает все значения из списка (отображая в метка), а затем начать замедляться и остановиться на случайной строке из списка. Почти как «вращающийся / прокручивающийся / мерцающий круг текста».

Я все еще очень плохо знаком с программированием (второй день обучения C#), поэтому был бы рад, если бы кто-то мог указать мне правильное направление , L oop с таймером?

List<string> randomStrings = new List<string>();

        public MainWindow()
        {
            InitializeComponent();
            randomString.Add("Abcd");
            randomString.Add("Water");
            randomString.Add("Moon");
            randomString.Add("Pizza");
            randomString.Add("Winter");
            randomString.Add("Orange");

            MyRandomStrings.ItemsSource = randomString; //Showing wich strings in box.
        }

        public void GetRandomString()
        {
            Random r = new Random();
            int index = r.Next(randomString.Count);
            string myRandomString = randomString[index]; //Fetch a random string

            Result.Content = myRandomString; //Sets the label. I want this to be "animated".
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            GetRandomString();
        }

1 Ответ

1 голос
/ 17 января 2020

Вы можете использовать Task.Delay для создания задержки и по-прежнему создавать последовательный код вместо машины состояний или таймеров и т. Д. c.

Вот пример:

Он использует Метка и кнопка на WindowsForm. Таким образом, с небольшим изменением, вы можете заставить его работать в вашей конфигурации.

public partial class MainWindow : Form
{
    private List<string> _randomStrings = new List<string>();
    private Random _rnd = new Random(DateTime.UtcNow.Millisecond);

    public MainWindow()
    {
        InitializeComponent();
        _randomStrings.Add("Abcd");
        _randomStrings.Add("Water");
        _randomStrings.Add("Moon");
        _randomStrings.Add("Pizza");
        _randomStrings.Add("Winter");
        _randomStrings.Add("Orange");
    }

    private async void button1_Click(object sender, EventArgs e)
    {
        // determine the rollcount. (some initial rolls for the rolling effect)
        int rollCount = 50 + _rnd.Next(_randomStrings.Count);

        int index = 0;

        // roll it.......
        for (int i = 0; i < rollCount; i++)
        {
            // just use a modulo on the i to get an index which is inside the list.
            index = i % _randomStrings.Count;

            // display the current item
            label1.Text = _randomStrings[index];

            // calculate a delay which gets longer and longer each roll.
            var delay = (250 * i / rollCount);

            // wait some. (but don't block the UI)
            await Task.Delay(delay);
        }

        MessageBox.Show($"and.... The winner is... {_randomStrings[index]}");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...