c# WPF将worker信息从worker.cs推送到Home.xaml

本文关键字:worker Home xaml WPF 信息 cs | 更新日期: 2023-09-27 18:12:14

我对WPF很陌生,我已经尝试了几天了。

在mainwindow . example .cs中,我创建了一个新的Worker实例。

    public MainWindow()
    {
        InitializeComponent();
        Worker worker = new Worker();
        worker.run_Worker();
    }

主窗口。xaml加载Home。Xaml on startup:

ContentSource = "/页面/Home.xaml"

In my Home。我有一个进度条和一个Infolog。

在Worker中,我尝试这样做:

 Home home = new Home();
 Dispatcher.BeginInvoke(new Action(() =>
 {
      home.InfoLog.Content = "test";
 }));

如果我把worker的代码放到Home. example .cs中,而不是如果我把worker放在一个单独的类中,并把数据推送到Home的一个新实例中,那么它正在工作。

是否有办法将信息推送到不同的类/页面,而不使用Home()的新实例?

谢谢你

c# WPF将worker信息从worker.cs推送到Home.xaml

你可以将"this"传递给new Worker(),并使其成为Worker的私有属性。所以:

UI

<Window x:Class="testappreddit.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:testappreddit"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Title="MainWindow"
Width="525"
Height="350"
DataContext="{Binding RelativeSource={RelativeSource Self}}"
mc:Ignorable="d">
<Grid>
<StackPanel>
    <Home x:Name="home" />
</StackPanel>
</Grid>
</Window>

后端

public class MainWindow{
    public MainWindow()
    { 
       InitializeComponent(); 
       Worker worker = new Worker(this); 
       worker.run_Worker(); 
    }
}
public class Worker
{
 private MainWindow lthis{get;set;}
 public Worker(MainWindow lthis)
 {
   this.lthis = lthis; 
 }
 public void run_worker(){
    while(lthis != default(MainWindow)){
       DoWork();
       Thread.Sleep(5000);
    }
 }
 private void DoWork(){
     Application.Current.Dispatcher.BeginInvoke(new Action(() =>
        {
          lthis.home.InfoLog.Content = "test";
        }));
  }
}
public class Home
{
   public InfoLog InfoLog {get;set;}
}
public class InfoLog
{
  public string Content {get;set;}
}

您还必须使用

Application.Current.Dispatcher

调用任何UI更改