C# Backgroundworker打开主窗口拥有的第二个窗口

C# Backgroundworker打开主窗口拥有的第二个窗口,c#,wpf,backgroundworker,C#,Wpf,Backgroundworker,我面临这个问题:我有两个窗口(mainwindow和custommessage)。在我的代码中,我需要使用backgroundworker。在Dowork方法中,我想打开与主窗口大小(宽度/高度)相同的第二个窗口(custommessage)。因为我不知道主窗口的大小,所以我需要使第二个窗口归第一个窗口所有。 这是我的密码: private void Starter_Click(object sender, RoutedEventArgs e) { string

我面临这个问题:我有两个窗口(mainwindow和custommessage)。在我的代码中,我需要使用backgroundworker。在Dowork方法中,我想打开与主窗口大小(宽度/高度)相同的第二个窗口(custommessage)。因为我不知道主窗口的大小,所以我需要使第二个窗口归第一个窗口所有。 这是我的密码:

    private void Starter_Click(object sender, RoutedEventArgs e)
    {
        string linkaddress = Address.Text;

        BackgroundWorker CheckValidAddressBW = new BackgroundWorker();
        CheckValidAddressBW.DoWork += CheckValidAddressBWDoWork;
        CheckValidAddressBW.RunWorkerCompleted += CheckValidAddressBWComplete;
        CheckValidAddressBW.RunWorkerAsync(linkaddress);
    }

    static void CheckValidAddressBWDoWork(object sender, DoWorkEventArgs e)
    {
        string bandaddress =""+ e.Argument;
        bool isValid = false;
        /* STUFF INSIDE */
        e.Result = isValid;
    }
    static void CheckValidAddressBWComplete(object sender, RunWorkerCompletedEventArgs e)
    {
        bool result =(bool) e.Result;
        if(result==false)
        {
            CustomMessage cm = new CustomMessage ();
            cm.Width = 800;                
            cm.Height = 600;
            cm.Show();
        }
    }
在这段代码中,我想做的是:

        if(result==false)
        {
            CustomMessage cm = new CustomMessage {Owner=this}; //WHERE this means the mainwindow
            cm.Width = this.ActualWidth;                
            cm.Height = this.ActualHeight;
            cm.Show();
        }
因为我用的是后台工作人员,所以我不能用“这个”这个词。所以我想知道是否有办法做到这一点。 先谢谢你


注意:我希望我的问题很清楚:)

我认为需要将mainwindow对象作为BackgroundWorker的参数之一传递。 这里我使用了元组对象作为示例,但您可能需要创建更合适的类对象:

private void Starter_Click(object sender, RoutedEventArgs e)
{
    var linkaddress = Address.Text;

    BackgroundWorker CheckValidAddressBW = new BackgroundWorker();
    CheckValidAddressBW.DoWork += CheckValidAddressBWDoWork;
    CheckValidAddressBW.RunWorkerCompleted += CheckValidAddressBWComplete;
    CheckValidAddressBW.RunWorkerAsync(Tuple.Create<string, Window>(linkaddress, this));
}
static void CheckValidAddressBWDoWork(object sender, DoWorkEventArgs e)
{
    Tuple<string, Window> args = e.Argument as Tuple<string, Window>;
    string bandaddress = args.Item1;
    bool isValid = false;
    /* STUFF INSIDE */
    e.Result = Tuple.Create<bool, Window>(isValid, args.Item2);
}
static void CheckValidAddressBWComplete(object sender, RunWorkerCompletedEventArgs e)
{
    Tuple<bool, Window> args = e.Result as Tuple<bool, Window>;
    bool result = args.Item1;
    if (result == false)
    {
        CustomMessage cm = new CustomMessage { Owner = args.Item2 };
        cm.Width = 800;
        cm.Height = 600;
        cm.Show();
    }
}
private void start\u单击(对象发送方,路由目标)
{
var linkaddress=Address.Text;
BackgroundWorker CheckValidAddressBW=新的BackgroundWorker();
CheckValidAddressBW.DoWork+=CheckValidAddressBWDoWork;
CheckValidAddressBW.RunWorkerCompleted+=CheckValidAddressBWComplete;
CheckValidAddressBW.RunWorkerAsync(Tuple.Create(linkaddress,this));
}
静态无效检查ValidAddressBwDoWork(对象发送方,DoWorkEventArgs e)
{
Tuple args=e.参数作为Tuple;
字符串banddress=args.Item1;
bool isValid=false;
/*里面的东西*/
e、 结果=Tuple.Create(isValid,args.Item2);
}
静态无效检查ValidadDressBwComplete(对象发送方、RunWorkerCompletedEventArgs e)
{
Tuple args=e。结果为Tuple;
bool result=args.Item1;
如果(结果==false)
{
CustomMessage cm=新CustomMessage{Owner=args.Item2};
厘米宽=800;
厘米高度=600;
cm.Show();
}
}

您可以使用更少的代码和任务来完成此任务

private void Starter_Click(object sender, EventArgs e)
{
        Task<bool> taskA = new Task<bool>(() => { return IsValid(); });
        taskA.ContinueWith((ss) =>
        {
            if (ss.Result)
            {
                MessageBox.Show("Showing Window");
            }
        });
        taskA.Start();
}

private bool IsValid()
{
        System.Threading.Thread.Sleep(5000);
        return true;
}
private void start\u单击(对象发送方,事件参数e)
{
Task taskA=新任务(()=>{return IsValid();});
任务A.继续使用((ss)=>
{
若有(ss.结果)
{
MessageBox.Show(“显示窗口”);
}
});
taskA.Start();
}
私有bool是有效的()
{
系统线程线程睡眠(5000);
返回true;
}
或者因为您使用.NET4.5,所以可以使用asunc/await

private async void Starter_Click(object sender, EventArgs e)
{
        bool res = await Task.Factory.StartNew<bool>(() => { return IsValid(); });
        if (res)
            MessageBox.Show("Showing Window");
}

private bool IsValid()
{
        System.Threading.Thread.Sleep(5000);
        return true;
}
private async void Starter\u单击(对象发送方,事件参数e)
{
bool res=wait Task.Factory.StartNew(()=>{return IsValid();});
如果(res)
MessageBox.Show(“显示窗口”);
}
私有bool是有效的()
{
系统线程线程睡眠(5000);
返回true;
}

因为您希望处理程序具有类实例的特定知识,所以不要将它们设置为静态,而是将它们设置为实例方法。由于您是从另一个实例方法附加处理程序,因此处理程序将在该实例上调用该方法,从而确保这些处理程序具有引用您关心的实例的
this
引用。

尝试此操作

System.Windows.Application.Current.MainWindow

我不知道你想做什么,但是如果你从这两种方法中删除“static”,你就可以使用“this”,谢谢你的回答。这正是我想要的:)当我使用bacgroundworkers时,我经常使用静态,所以我没有意识到它会产生问题:)你使用的是哪个版本的.NET framework?实际上我使用的是NET 4,5谢谢你的回答。我也会尝试这个解决方案