我有一些代码,当我调用CustomMessageBox
时,它会显示一个框,其中包含一个用户提示,表示我要添加的对象数量,一旦完成,我就将其添加到对象列表中。添加后,它会显示MessageBox.Show
,让用户知道它已添加。
我的问题是,当我运行代码时,它会执行所有代码,绕过自定义消息框的显示,然后显示MessageBox.Show
,然后显示CMB.Show。我通过调试器运行代码并跟踪路径,它在MessageBox.Show之前点击CMB.Show,但是在代码完成后显示。对不起,我还在学习,可能不会很好地解决问题,如果有什么我可以进一步解释,请告诉我。
一些代码:
private int BasicLand(Card basicLand)
{
var countBox = new TextBox
{
Name = "count",
Width = 100,
};
var cmbCount = new CustomMessageBox
{
Caption = "Blah",
Content = countBox,
RightButtonContent = "ok",
};
cmbCount.Dismissed += (s1, e1) =>
{
switch (e1.Result)
{
case CustomMessageBoxResult.RightButton:
if (int.TryParse(countBox.Text, out tempInt) && Convert.ToInt32(countBox.Text) > 0)
{
countReturn = Convert.ToInt32(tempInt);
break;
}
else
{
//Some code for error....
}
}
};
cmbCount.Show();
return countReturn;
}
然后是另一个首先触发但在代码块中最后的部分。
MessageBox.Show("Object was added to List!");
我尝试将ShowDialog添加到自定义框中,但它在VS中出现了问题。 BasicLand在另一个方法中调用,当对象添加到列表时,它将显示MessageBox.Show。
答案 0 :(得分:0)
您的代码存在问题,它没有考虑任何用户交互是异步的。当你调用Show()
它实际上会显示消息框,但它不会阻止你当前运行的线程,调用Show()
后的其他语句将立即执行,因此你的方法返回一个返回值用户未提供但仅为默认值。要解决此问题,您必须以延续的方式编写代码。
private void PromtUserForFeeblefezerAmount(Action<int> continueFeeblefzing, Action cancel)
{
var messagebox = CreateFeeblefezerPromt();
messagebox.Dismissed += (sender, args) =>
{
if ( args.Result == CustomMessageBoxResult.RightButton )
continueFeeblefzing( GetFeeblefezerAmount(messagebox) );
else
cancel();
};
messagebox.Show();
}