C# 在WPF和C中生成MainWindow()和InitializeComponent()#
此代码来自我的C#WPF应用程序:C# 在WPF和C中生成MainWindow()和InitializeComponent()#,c#,wpf,onload,C#,Wpf,Onload,此代码来自我的C#WPF应用程序: public MainWindow() { InitializeComponent(); status("Getting dl links"); getLinks(); } 过程getLinks当前在消息框中显示两个链接。在WPF应用程序可见之前,这些链接将显示在消息框中。 在这种情况下,这不是问题,但我如何显示任何项目的进度(如进度条) 我想在启动时加载的过程?任何“加载”任务都需要在后台线程上进行(请参阅BackgroundWor
public MainWindow()
{
InitializeComponent();
status("Getting dl links");
getLinks();
}
过程getLinks
当前在消息框中显示两个链接。在WPF应用程序可见之前,这些链接将显示在消息框中。
在这种情况下,这不是问题,但我如何显示任何项目的进度(如进度条)
我想在启动时加载的过程?任何“加载”任务都需要在后台线程上进行(请参阅BackgroundWorker类-google以获取大量示例)。这样,UI线程就可以自由地显示窗口并用状态消息更新窗口。否则,在加载完成之前,UI线程将被阻止执行任何操作。下面是一个如何执行的示例。为了简化它,我直接在
main窗口中添加了控件,但是我更喜欢使用XAML
public MainWindow()
{
InitializeComponent();
var progressBar = new ProgressBar();
progressBar.Height = 40;
progressBar.Width = 200;
progressBar.Margin = new Thickness(100, 100, 100, 100);
Task.Factory.StartNew(() =>
{
// getLinks();
for (var i = 0; i < 5; i++)
{
Dispatcher.Invoke(new Action(() => { progressBar.Value += 20; }));
Thread.Sleep(500);
}
});
var stackPanel = new StackPanel();
stackPanel.Children.Add(progressBar);
Content = stackPanel;
}
public主窗口()
{
初始化组件();
var progressBar=新的progressBar();
高度=40;
进度条宽度=200;
progressBar.Margin=新厚度(100100100100);
Task.Factory.StartNew(()=>
{
//getLinks();
对于(变量i=0;i<5;i++)
{
Invoke(新操作(()=>{progressBar.Value+=20;}));
睡眠(500);
}
});
var stackPanel=新的stackPanel();
stackPanel.Children.Add(progressBar);
内容=stackPanel;
}
我首先在界面上的某个地方添加一个ProgressBar
,使其在本演示中可见,然后我将其添加到一个新的StackPanel
,它可以是任何面板,在这种情况下都无所谓
为了在另一个线程上加载链接,我创建了一个新的任务
,这是.NET4.0中TPL
()的一部分。在本例中,我模拟运行getLinks()
需要5*500毫秒,实际上将加载五个链接,因此每次迭代20%
然后,我将20
添加到progressBar
值中,这表明它增加了20%
这句话可能会让你有点困惑
Dispatcher.Invoke(新操作(()=>{progressBar.Value+=20;}))代码>
但实际上,当您使用GUI进行跨线程编程时,这是非常常见的。所以问题是您在另一个线程上,我们开始了一个将在单独线程上运行的任务
,您不能从另一个线程更新UI线程。因此,您需要的是一个名为调度程序,它可以从窗口类中访问
然后您调用它的一个操作,这意味着您只需说“在这个线程上为我运行这段代码”
如果您想在加载所有内容时显示MessageBox
,只需添加MessageBox.Show(“已加载!”)代码>在for
-循环之后。放置Task.Factory.StartNew(()=>{})是否明智;关于euh,所有过程?@krtek,是和否。是否希望所有过程都运行async
?然后是,否则不是。但这是如何在后台运行的一个示例,您还可以查看Robert Levy建议的BackgroundWorker
。但是如果我有很多按顺序运行的过程,我可能会做的是将它们放在一起,运行一个调用所有过程的方法async
,你明白我的意思吗?另一方面,我也不会为每个过程创建后台工作程序。你总是可以重构代码,让它工作,然后重构它。谢谢你的回复。妈的,我真希望你一辈子都站在我身边:3