Принудительное обновление потока пользовательского интерфейса WPF для задачи - PullRequest
0 голосов
/ 14 января 2019

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

    private void BtnStart_Click(object sender, RoutedEventArgs e) {
        // Create a timer and add its corresponding event

        System.Timers.Timer timer = new System.Timers.Timer();
        timer.Elapsed += TimerFade_Elapsed;

        timer.Interval = 750;

        // Want a new thread to run this task on so
        // the main thread doesn't wait.

        Task task = new Task(() => timer.Start());
        task.Start();          
        //r.SingleThread();

    }

    private void TimerFade_Elapsed(object sender, System.Timers.ElapsedEventArgs e) {
        // Access UI thread to decrease Opacity on a button from a different thread.

        Dispatcher.Invoke(() => {
            if (btnStart.Opacity != 0.0) {
                btnStart.Opacity -= 1.0;
                // code here to force update the GUI.
            } else {
                System.Timers.Timer t;
                t = (System.Timers.Timer)sender;
                t.Stop();
            }
        });          

    }

Код работает, однако визуально, это не так. Я подозреваю, что это связано с тем, что я не обновляю графический интерфейс при внесении изменений.

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Вы можете просто использовать раскадровку. Создайте его в ресурсе объекта (например, Window / Page или как у вас есть), а затем вызовите раскадровку из кода.

Вот пример:

 <Window.Resources>
 <Storyboard x:Key="FadeAnim">
        <DoubleAnimation Storyboard.TargetProperty="Opacity" From="1" To="0" Duration="0:0:0.4"/>
    </Storyboard>
 </Window.Resources>

И назовите его из кода, подобного этому:

 Storyboard sb = this.FindResource("FadeAnim") as Storyboard;
 Storyboard.SetTarget(sb, this.YourButton);
 sb.Begin();
0 голосов
/ 14 января 2019

Приведенный код работает нормально. Значение непрозрачности варьируется от 0 до 1. Вы устанавливаете его на 1 при первом запуске, что приводит к исчезновению кнопки при первом обновлении. Если вы можете изменить следующую строку

btnStart.Opacity - = 1,0;

К

btnStart.Opacity - = 0,1;

Вы сможете видеть, как медленно исчезает кнопка.

PS: лучший способ сделать это - использовать StoryBoard (DoubleAnimation), как упомянуто @ zack

...