C# 过程中在屏幕上显示信息
我想在屏幕上显示有关流程的信息,供用户查看 开始时,我使用了另一个线程,但这引发了一个异常。现在我不知道了。如何在另一个过程中同时更改屏幕上的值 如何使用GetElapsedTime显示进程中经过的毫秒数 WPF(XAML代码)C# 过程中在屏幕上显示信息,c#,wpf,C#,Wpf,我想在屏幕上显示有关流程的信息,供用户查看 开始时,我使用了另一个线程,但这引发了一个异常。现在我不知道了。如何在另一个过程中同时更改屏幕上的值 如何使用GetElapsedTime显示进程中经过的毫秒数 WPF(XAML代码) 公共部分类主窗口:窗口 { 私人工作状态_工作状态; 公共主窗口() { 初始化组件(); } 私有无效按钮开始单击(对象发送者,路由目标) { _StatusOfWork=新建StatusOfWork(); _工作状态。计数n(10); 这个
公共部分类主窗口:窗口
{
私人工作状态_工作状态;
公共主窗口()
{
初始化组件();
}
私有无效按钮开始单击(对象发送者,路由目标)
{
_StatusOfWork=新建StatusOfWork();
_工作状态。计数n(10);
这个。关闭();
}
}
工作类别
{
公共日期时间StartDateTime{get;set;}
公共无效计数(整数次)
{
StartDateTime=DateTime.Now;
对于(inti=1;i,您需要使用WPF数据绑定概念。我建议您看看这个,它有几个到各种教程的好链接
话虽如此,对代码的一个更改应该让您开始:我为标签添加了一个名为laveleversedtime
的绑定
<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>
为简单起见,我将属性保留为字符串,但您可能希望使用不同的数据类型。您将需要使用ValueConverter
。上面提到的stackoverflow文章中的链接详细解释了这一点
另外:我猜您在使用线程时遇到的异常可能是调度异常。这是一个帮助您了解如何修复该异常的方法。这将不起作用。使用thread.Sleep的循环只会阻塞UI线程。使单击处理程序异步并替换thread.Sleep withwait Task.Delay()
。除此之外,绑定失效时间
缺少一个源代码。您可以将窗口的DataContext设置为自身,或者使用ElementName或RelativeSource绑定。鉴于该问题没有包含完整的源代码,我认为建议的答案就足够了。老实说,这个问题可能被标记为not compl够了。很好,有一个答案可以帮助回答这个问题,句号。@tatmanblue这个答案很糟糕。它不能解释任何事情,代码也不起作用。你的投票没有让它变得更好。此外,这个问题不应该(现在)答案是肯定的,因为不清楚OP实际上想要实现什么。另外,ReleasedTimeDependency
是不完整和错误的。dependency属性ReleasedTime
的标识符字段必须命名为ReleasedTimeProperty
,并且应该在帖子中显示。而且,您不会真正使用字符串
pe表示“经过的时间”。请改用TimeSpan
。现在还不清楚您到底想在这里做什么。是否确实有后台线程?是否需要?为什么不能使用BackgroundWorker,或者更好的async/await
?
<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>
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();
}
}