在窗口上动态启用和禁用按钮

时间:2015-09-14 13:34:47

标签: c# wpf

我正在尝试更新自制的自定义消息框(继承自Window)

我试图找到的解决方案是显示禁用按钮的消息框,直到条件发生变化,然后再次启用它们以允许程序继续。

我尝试使用“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”但是不会关闭第一个对话框以显示启用了按钮的下一个对话框。

有人可以给我任何指导吗?

1 个答案:

答案 0 :(得分:1)

您的对话框将停止代码工作,直到您确认它为止。 我认为对于你想要做的事情,你需要启动一个线程,用对话框阻止当前输入,当线程带有"工作时做"已完成关闭对话框或继续。

使用您编写的代码,您无法退出do while循环。

试着看看这个: https://msdn.microsoft.com/en-us/library/aa645740(v=vs.71).aspx

我有一个程序,我在后台执行某些操作,并显示用户应该使用progressdialog等待。您可以将此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。 不要忘记,当您访问对话框时,您需要注意它是线程。例如,为了增加进度,你可以这样做:

public void IncrementProgress()
    {
        if (progressBar1.InvokeRequired)
        {
            progressBar1.BeginInvoke(
                new Action(() =>
                {
                    progressBar1.Value++;
                }
                    ));
        }
        else
        {
            progressBar1.Value++;
        }
    }

我希望我可以帮助你。