我正面临这个问题:我有两个窗口(主窗口和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。我希望我的问题很明确:))
答案 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