为什么我的wpf GUI上的线程没有更新? [重复]

问题描述 投票:-1回答:1

这个问题在这里已有答案:

我正在编写一个简单的动画,通过网格改变标签位置。我尝试将Sleep方法用于Thread,但每秒移动的标签动画都不可见。它只是在一段时间(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是标签的名称。单击按钮后调用该指令。我想理解为什么它不起作用,我做错了什么,如果更好地使用另一个不是线程的东西。我希望不仅能获得快速解决方案,还能获得完整的解决方案。谢谢

c# wpf thread-sleep
1个回答
-2
投票

我想你是通过Mainthread来做的,所以你MainThread睡了所以没有时间更新GUI

上一个答案将System.Windows.Forms.Application.DoEvents;添加到代码中,告诉MainThread在队列中执行其他工作,然后继续睡眠。

我建议你不要睡觉主线程,这将导致你的应用程序卡住。通过另一个线程而不是主线程执行此操作

for (int i = 1; i < 4; i++)
{
    Dispatcher.BeginInvoke(DispatcherPriority.SystemIdle, () => { Grid.SetColumn(lblUno, i) } );
    Thread.Sleep(1000);
}
© www.soinside.com 2019 - 2024. All rights reserved.