我想简单的是/否选择MessageBox,但我认为为此设计一个表单是无稽之谈.我以为我可以使用MessageBox,添加按钮等来实现这一目标.这很简单,但由于没有返回DialogResult,我该如何检索结果?
我在调用窗口中使用ShowDialog()显示一个WPF窗口.窗口打开,按预期模态.但是,在我的确定和取消按钮的对话窗口中的单击事件中,我分别设置了this.DialogResult = true(或false),并且未设置该值.窗口按预期关闭,但DialogResult仍为null.
这是WPF中的错误吗?或者是否有原因无法设置DialogResult属性但不会抛出异常?该窗口未托管在浏览器中.
调用窗口中的代码:
Window2 win = new Window2();
bool? result = win.ShowDialog();
if (result.HasValue && result.Value) {
//never gets here because result is always null
}
Run Code Online (Sandbox Code Playgroud)
对话框窗口中的代码:
this.DialogResult = true;
Run Code Online (Sandbox Code Playgroud) 在回答我最近的一个问题(这里)时,汉斯帕斯特说我应该设置DialogResult
关闭我的表格而不是form.Close()
我似乎无法找出原因?
如果我已经正确阅读,MSDN文档说明这样做只会隐藏表单而不是正确处理它我认为.Close()
这样做?
从文档中提取.
当用户单击对话框的"关闭"按钮或设置DialogResult属性的值时,不会自动调用Close方法.相反,表单是隐藏的,可以再次显示,而无需创建对话框的新实例.由于此行为,您必须在应用程序不再需要表单时调用表单的Dispose方法.
另一方面,Microsoft创建了一个支持页面,其中说明了如何使用DialogResult属性,并在其"验证它工作"部分中声明单击这样将关闭表单.
所以我的问题是双重的,我应该继续使用Close或DialogResult; 并且对话框结果关闭或隐藏表单.从我下面的代码(一个带有两个按钮的简单表单),看起来它确实只是作为一个断点点this.Close()
被隐藏...(this.Close()
注释,表单仍然消失,只是不确定是否隐藏)
public Form1()
{
InitializeComponent();
button1.Click += (s, e) =>
{
//I edited my question to include using
using(Form1 form = new Form1())
{
form.ShowDialog();
}
};
button2.Click += (s, e) =>
{
this.DialogResult = DialogResult.OK;
this.Close();
};
}
Run Code Online (Sandbox Code Playgroud) 任何人都可以想到一个很好的解释,因为对话的结果是WPF中可以为空的bool吗?这一直困扰着我.在WinForms中它是一个枚举类型,这对我来说更有意义.
在System.Windows中.表单 .Button有一个属性DialogResult,System.Windows中的这个属性.控制 .Button(WPF)?
编辑:这个方法实际上很好,我问它后来找到了解决方案.我在重载的ShowDialog()方法中添加了正确的调用(它不是一个过载,甚至是重写,但它的工作原理是一样的.我的新问题是底部的问题.
我有一个表单,您可以在其中单击三个按钮之一.我已经为返回的结果定义了一个枚举.我想打电话:
MyFormResults res = MyForm.ShowDialog();
Run Code Online (Sandbox Code Playgroud)
我可以使用以下代码添加一个新的ShowDialog方法:
public new MyFormResults ShowDialog()
{
//Show modal dialog
base.ShowDialog(); //This works and somehow I missed this
return myResult; //Form level variable (read on)
}
Run Code Online (Sandbox Code Playgroud)
单击按钮时,我为结果设置了一个表单级变量:
MyFormResults myResult;
private void btn1_click(object sender, EventArgs e)
{
myResult = MyFormsResults.Result1;
this.DialogResult = DialogResult.OK; //Do I need this for the original ShowDialog() call?
this.Close(); //Should I close the dialog here or in my new ShowDialog() function?
}
//Same as above for the other results
Run Code Online (Sandbox Code Playgroud)
我唯一缺少的是显示对话框(模态)的代码,然后返回我的结果.没有base.ShowDialog()
功能,我该怎么做? …
我试图用DialogResult
来检查Messagebox
的YesNoCancel.我正在使用以下代码,我没有看到任何问题:
DialogResult dlgResult = MessageBox.Show(
"Save changes before closing?",
"Warning",
MessageBoxButton.YesNoCancel,
MessageBoxImage.Question);
Run Code Online (Sandbox Code Playgroud)
但Visual Studio引发了我的错误说法
'System.Windows.Window.DialogResult'是'属性'但是像'类型'一样使用
我有一个表单Form1
,我将其显示Form2
为模态表单.从Form2
我做各种编辑和删除不同的值集合,应该Form1
在关闭后反映出来Form2
.所以我做的就是RePopulateControls_in_Form1()
关闭之后Form2
.由于RePopulateControls_in_Form1()
是一个漫长的过程,我只想在发生一些修改(编辑,添加,删除)Form2
而不是Form2
刚刚打开和关闭时执行该方法.
所以这就是我尝试做的事情Form1
:
Form2 f = new Form2();
if (f.ShowDialog(this) == DialogResult.Something)
RePopulateControls_in_Form1()
Run Code Online (Sandbox Code Playgroud)
然后在Form2中,
private void bntEdit()
{
//If Edit?
this.DialogResult = DialogResult.Something;
}
private void bntAdd()
{
//If Add?
this.DialogResult = DialogResult.Something;
}
private void bntDelete()
{
//If Delete?
this.DialogResult = DialogResult.Something;
}
Run Code Online (Sandbox Code Playgroud)
但我的问题是.Something
.如果它不是.None
,Form2
只需关闭.Form2
除非用户关闭它,否则我不想简单地关闭它.
如果我这样做:
//in Form1
private void Form1_Click() …
Run Code Online (Sandbox Code Playgroud) 我有一个自定义对话框winform.在它上面我有一个标签,文本框和2个按钮(确定和取消).它还声明并定义了用于传递不同参数列表的重载执行方法.
Dialog Winform的调用方式如下:
var theDialog := new InputMsgBox;
if theInputB.Execute('Awesome StackOverflow','Enter Text?',s,var s) = DialogResult.OK then
begin
Invalidate;
SetText(s);
end;
Run Code Online (Sandbox Code Playgroud)
Dialog Winform执行定义如下:
method InputMsgBox.Execute(Title, theMessage, defaultanswer:string;var thevalue:string): DialogResult;
begin
result := DialogResult.Cancel;
Requesttext.Text:=themessage;
Requesttext.Enabled:=true;
Requesttext.Visible:=true;
InputTextBox.Text:=defaultanswer;
InputTextBox.Enabled:=true;
InputTextBox.Visible:=true;
CancelBtn.Enabled:=true;
CancelBtn.Visible:=true;
Okbtn.Enabled:=true;
Okbtn.Visible:=true;
self.ShowDialog;
Result := self.DialogResult;
thevalue:=InputTextBox.Text;
end;
Run Code Online (Sandbox Code Playgroud)
当execute方法返回给调用者时,即使单击OKBtn,它也总是返回DialogResult.Cancel.
按钮的对话框相应地设置.
我在Dialog winform上设置了AcceptButton和CancelButton.
我无法弄清楚为什么showdialog方法总是返回DialogResult.Cancel.
更新完成一些测试后,我发现通过调用showdialog = DialogResult.Ok显示我的其他自定义对话框窗口工作正常.所以,我检查了它们两个以查看它们的属性设置是否存在一些差异,并且绝对没有区别.我不明白.提前致谢,
我有一个带有按钮的VB6表单,文本为"继续"和"取消".我想检查点击了哪一个.在C#中,每个表单都有一个对话框结果,我可以在退出表单之前根据单击的按钮进行设置.我在VB6中没有看到这一点.
是否有对话结果?如果不是,检查对话结果的最佳做法是什么?
dialogresult ×10
c# ×6
winforms ×4
wpf ×4
modal-dialog ×3
.net ×2
api-design ×1
button ×1
delphi-prism ×1
dialog ×1
overloading ×1
return-value ×1
vb6 ×1