Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在WPF和C中生成MainWindow()和InitializeComponent()#_C#_Wpf_Onload - Fatal编程技术网

C# 在WPF和C中生成MainWindow()和InitializeComponent()#

C# 在WPF和C中生成MainWindow()和InitializeComponent()#,c#,wpf,onload,C#,Wpf,Onload,此代码来自我的C#WPF应用程序: public MainWindow() { InitializeComponent(); status("Getting dl links"); getLinks(); } 过程getLinks当前在消息框中显示两个链接。在WPF应用程序可见之前,这些链接将显示在消息框中。 在这种情况下,这不是问题,但我如何显示任何项目的进度(如进度条) 我想在启动时加载的过程?任何“加载”任务都需要在后台线程上进行(请参阅BackgroundWor

此代码来自我的C#WPF应用程序:

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