我想在屏幕上显示有关过程的用户一般信息!
在一开始,我使用了另一个线程,但这引发了异常。现在我不知道。如何与另一个过程同时在屏幕上更改值?
如何使用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;
}
}
答案 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,可帮助您了解如何解决该问题。