【问题标题】:Why my thread on wpf GUI is not updating? [duplicate]为什么我在 wpf GUI 上的线程没有更新? [复制]
【发布时间】:2019-02-24 04:04:22
【问题描述】:

我正在编写一个通过网格更改标签位置的简单动画。我尝试对线程使用 Sleep 方法,但标签每秒移动的动画不可见。它只是在一段时间(3 秒)后在最终位置显示标签。

这是 C# 代码:

private void BtnUno_Click(object sender, RoutedEventArgs e)
{
        for(int i = 1; i < 4; i++)
        {
            Grid.SetColumn(lblUno, i);
            Thread.Sleep(1000);
        }
}

XAML 代码:

<Window x:Class="AlgoritmoDDA.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:AlgoritmoDDA"
    mc:Ignorable="d"
    Title="Algoritmo DDA" Height="450" Width="700" ResizeMode="NoResize">
<Grid>
    <Grid Name="screen" Height="150" Width="600" VerticalAlignment="Top" Margin="0, 40">
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>

        <Label Name="lblUno" Background="Black" Grid.Column="0"/>
    </Grid>

    <Button Name="btnUno" Content="Click Me" Height="34" Width="100"
            VerticalAlignment="Bottom" Margin="0,30"
            FontSize="16"
            Click="BtnUno_Click"/>
</Grid>

lblUno 是标签的名称。单击按钮后调用该指令。我想了解为什么它不起作用,我做错了什么,以及是否更好地使用另一个不是线程的东西。我希望得到的不仅仅是一个快速的解决方案,而是一个完整的解决方案。谢谢

【问题讨论】:

  • 如果您能提供minimal reproducible example,那就太好了。 I implement a thread 是什么意思?
  • 永远不要在 UI 应用程序中调用 Thread.Sleep。将Thread.Sleep(1000) 替换为await Task.Delay(1000) 并声明Click 处理程序方法async

标签: c# wpf thread-sleep


【解决方案1】:

我猜你是通过 Mainthread 执行此操作的,所以 MainThread 进入休眠状态,所以没有时间更新 GUI

上一个答案 add System.Windows.Forms.Application.DoEvents; to code 是告诉 MainThread 做队列中的其他作业,然后继续休眠。

我建议你不要让 MainThread 休眠,这会导致你的应用程序卡住。 由 MainThread 以外的其他线程执行此操作。

for (int i = 1; i < 4; i++)
{
    Dispatcher.BeginInvoke(DispatcherPriority.SystemIdle, () => { Grid.SetColumn(lblUno, i) } );
    Thread.Sleep(1000);
}

【讨论】:

  • 甚至可以跳过手动线程并使用异步编程
  • 不编译。 (;预期)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-13
  • 2021-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多