在窗口上动态启用和禁用按钮
本文关键字:按钮 启用 窗口 动态 | 更新日期: 2023-09-27 18:12:35
我正在尝试更新我制作的自定义消息框(从窗口继承)
我试图找到的解决方案是显示消息框禁用按钮,直到条件发生变化,然后再次启用它们以允许程序继续。
我尝试使用"show"方法来代替显示对话框,但是上下文不显示。
请参阅下面我目前的方法:
TPromptWindow w_continue;
bool b_enableBtn = false;
do {
w_continue = new TPromptWindow("Please Wait", "OK", "Cancel", b_enableBtn);
w_continue.ShowDialog();
}
while ( conditionBoolean );
w_continue.Close(); // I know this doesnt work, but just tryign to show my intentions
b_enableBtn = true;
w_continue = new TPromptWindow("Please Wait", "OK", "Cancel", b_enableBtn);
w_continue.ShowDialog();
我的解决方案的第一个问题是,显示的第一条消息不会自毁,它总是等待用户输入。我试着在do while语句之后调用"Close",但这不会关闭第一个对话框以显示下一个启用按钮的对话框。
有谁能给我一些指导吗?您的对话框将停止代码工作,直到您确认它。我认为对于你想要做的,你需要启动一个线程,用对话框阻塞当前输入,当线程与"工作要做"已经完成关闭对话框或继续。
使用您编写的代码,您不能退出do while循环。
试着看看这个:https://msdn.microsoft.com/en-us/library/aa645740 (v = vs.71) . aspx
我有一个程序,我在后台做一些事情,我用一个进度对话框显示用户应该等待。您可以用任何您想要的对话框替换这个progressdialog。你只需要创建一个表单,让它成为模态,这样它就能阻止输入。这是用locked属性完成的。下面是我如何做的一个例子:
//This is a bool to see if some other process is already running.
if (isProcessRunning)
{
MessageBox.Show("Currently someone else is working!!!");
return;
}`var progressDialog = new ProgressDialog();
//if you don't have a maximum value because you don't know how long it will take you should set indeterminate to true.
progressDialog.setMaximum(<maximum value>);
progressDialog.Text = "<what are you doing>";
var backgroundThread = new Thread(() =>
{
isProcessRunning = true;
//this does not have to be a loop, you can also do other stuff you just have to set you bar to indeterminate then.
foreach (<do my stuff>)
{
<do stuff here that takes time>
progressDialog.IncrementProgress();
}
//Close the progressdialog threadsave.
if (progressDialog.InvokeRequired)
progressDialog.BeginInvoke(new Action(() => progressDialog.Close()));
isProcessRunning = false;
});
backgroundThread.Start();
progressDialog.ShowDialog();
这应该能解决你的问题。如果你需要progressdialog。不要忘记,当您访问您的对话框时,您需要注意它是threadsave。例如,要增加进度,您可以这样做:
public void IncrementProgress()
{
if (progressBar1.InvokeRequired)
{
progressBar1.BeginInvoke(
new Action(() =>
{
progressBar1.Value++;
}
));
}
else
{
progressBar1.Value++;
}
}
我希望我能帮到你。