【问题标题】:Backgroundworker open a second window owned by main windowBackgroundworker 打开主窗口拥有的第二个窗口
【发布时间】:2014-09-09 16:31:44
【问题描述】:

我正面临这个问题:我有两个窗口(主窗口和自定义消息)。在我的代码中,我需要使用后台工作人员。在 Dowork 方法中,我想打开与主窗口具有相同大小(宽度/高度)的第二个窗口(自定义消息)。由于我不知道主窗口的大小,我需要使第二个窗口归第一个窗口所有。 这是我的代码:

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

因为我使用的是后台工作人员,所以我不能使用“this”这个词。所以我想知道是否有办法做到这一点。 提前谢谢你。

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

【问题讨论】:

  • 我不确定你想做什么,但如果你从这两种方法中删除“静态”,你将能够使用“this”
  • 感谢您的回答。这正是我一直在寻找的 :) 当我使用 bacgroundworkers 时,我经常使用静态,所以我没有意识到它会产生问题 :)
  • 您使用哪个版本的 .NET 框架?
  • 其实我用的是 NET 4,5

标签: c# wpf backgroundworker


【解决方案1】:

我认为您需要将主窗口对象作为 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();
    }
}

【讨论】:

  • 感谢您的回答。我也会尝试这个解决方案
【解决方案2】:

您可以使用 Tasks 以更少的代码完成此操作

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      试试这个

      System.Windows.Application.Current.MainWindow
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-12-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-30
        • 1970-01-01
        相关资源
        最近更新 更多