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

时间:2014-09-09 16:31:45

标签: c# wpf backgroundworker

我正面临这个问题:我有两个窗口(主窗口和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();
        }

由于我使用的是背景工作者,我无法使用"这个"。所以我想知道是否有办法做到这一点。 提前谢谢。

N.b。我希望我的问题很明确:))

4 个答案:

答案 0 :(得分:0)

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

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();
    }
}

答案 1 :(得分:0)

您可以使用任务

以更少的代码执行此操作
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;
}

或者因为你使用.NET 4.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;
}

答案 2 :(得分:0)

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

答案 3 :(得分:0)

试试这个

System.Windows.Application.Current.MainWindow