在处理过程中在屏幕上显示信息

时间:2018-12-21 16:32:40

标签: c# wpf

我想在屏幕上显示有关过程的用户一般信息!

在一开始,我使用了另一个线程,但这引发了异常。现在我不知道。如何与另一个过程同时在屏幕上更改值?

如何使用GetElapsedTime来显示过程中经过的毫秒数?

WPF(XAML代码)

<StackPanel>
    <Button Content="Start" Height="20" Width="50" HorizontalAlignment="Left" Name="ButtonStart" Click="ButtonStart_Click"/>
    <Label Content="Elapsed Time (Milliseconds):"/>
    <Label Name="LabelElapsedTime" Content="0"/>
</StackPanel>


public partial class MainWindow : Window
{
    private StatusOfWork _StatusOfWork;
    public MainWindow()
    {            
        InitializeComponent();
    }


    private void ButtonStart_Click(object sender, RoutedEventArgs e)
    {
        _StatusOfWork = new StatusOfWork();
        _StatusOfWork.CountN(10);
        this.Close();
    }
}

class StatusOfWork
{
    public DateTime StartDateTime { get; set; }

    public void CountN(int nTimes)
    {
        StartDateTime = DateTime.Now;
        for (int i = 1; i <= nTimes; i++)
        {
            //doing anything
            //Another Process
            //...
            Thread.Sleep(1000);
        }
    }

    public double GetElapsedTime()
    {
        TimeSpan timeSpan = DateTime.Now - StartDateTime;
        return timeSpan.TotalMilliseconds;
    }
}

1 个答案:

答案 0 :(得分:0)

您需要使用WPF数据绑定概念。我建议您查看一下stackoverflow article,其中有指向各种教程的好链接。

话虽如此,这是您应该对代码进行的更改,可以让您入门:我为名为LabelElapsedTime的标签LapsedTime添加了绑定。

<StackPanel>
    <Button Content="Start" Height="20" Width="50" HorizontalAlignment="Left" Name="ButtonStart" Click="ButtonStart_Click"/>
    <Label Content="Elapsed Time (Milliseconds):"/>
    <Label Name="LabelElapsedTime"
        Content="{Binding ElapsedTime, RelativeSource={RelativeSource AncestorType=Window}}"/>
</StackPanel>

,并且绑定映射到主窗口上的具有相同名称LapsedTime的依赖项属性,如下所示:

public partial class MainWindow : Window
{
    private StatusOfWork _StatusOfWork;

    public MainWindow()
    {
        InitializeComponent();
    }

    public static readonly DependencyProperty ElapsedTimeProperty =
        DependencyProperty.Register(nameof(ElapsedTime), typeof(string), typeof(MainWindow));

    public string ElapsedTime
    {
        get { return (string)GetValue(ElapsedTimeProperty); }
        set { SetValue(ElapsedTimeProperty, value); }
    }

    private async void ButtonStart_Click(object sender, RoutedEventArgs e)
    {

        for(int count = 0; count < 10; count ++)
        {
            ElapsedTime = string.Format("{0}", count);
            await Task.Delay(1000);
        }
        this.Close();
    }
}

为简单起见,我将属性保留为字符串,但您可能希望使用其他数据类型。您将需要使用ValueConverter。上面提到的stackoverflow文章中的链接对此进行了更详细的说明。

另外:我猜您在使用线程时遇到的异常可能是调度异常。这是good article,可帮助您了解如何解决该问题。