【发布时间】:2010-05-05 16:19:48
【问题描述】:
我需要在 C#.Net 中创建一个用户控件,它可以添加到应用程序中而不可见 - 就像 FolderBrowserDialog 一样。这是一个我会经常使用的新窗口,所以我认为这是正确的方法。该窗口将通过调用另一个对话框中已知的 showDialog-Method 来打开。
有什么想法吗? 谢谢和问候,
丹尼尔
【问题讨论】:
标签: c# .net user-controls winforms
我需要在 C#.Net 中创建一个用户控件,它可以添加到应用程序中而不可见 - 就像 FolderBrowserDialog 一样。这是一个我会经常使用的新窗口,所以我认为这是正确的方法。该窗口将通过调用另一个对话框中已知的 showDialog-Method 来打开。
有什么想法吗? 谢谢和问候,
丹尼尔
【问题讨论】:
标签: c# .net user-controls winforms
由于所有这些“不可见”控件都派生自 Component 类,您应该先阅读有关它的 MSDN 文章:http://msdn.microsoft.com/en-us/library/system.componentmodel.component.aspx。
【讨论】:
只需将Visible 设置为false 或者这不是您想要的吗?
【讨论】:
根据定义,UserControl 不是Form;我认为您真正想要的是Component。也就是说,您真的不能创建一个具有您想要的功能的新Form 类吗?每当你想显示它时,创建一个新实例并调用ShowDialog。或者,如果您想保留状态,请将一个实例作为类成员添加到您的父表单,在您想要显示它时调用它的Show 方法,并在它的FormClosing 事件中添加一个事件处理程序来检查:
if (e.CloseReason == CloseReason.UserClosing)
如果是这样,
e.Cancel = true;
Hide();
(这最后一部分是为了防止用户关闭表单并在处理后再次尝试显示时出现错误。)
【讨论】:
我认为可能需要更多信息,但如果您创建自定义用户控件,该控件应该具有 .Visible 属性。下面是一个按钮如何位于表单上但对用户隐藏的示例。
button.Visible = true; // shows the button
button.Show(); // Shows the button
button.Visible = false; // hides the button
button.Hide(); // Hides the button
虽然按钮可能仍位于表单/控件上,但用户无法对其进行交互。您仍然可以对按钮执行编程控制,但本质上它在“隐藏”时不是用户控件。如果你希望有一种用户可以点击的隐藏按钮,你需要做其他事情来获得它,但它不应该是你想要的。
【讨论】:
这个显示/隐藏的思维过程听起来很像经典 VB 遗留下来的痛苦和困惑。显示和隐藏等旧的表单方法令人困惑,并且经常让我作为开发人员不知道对象是否存在或者是否仅仅是不可见的。如果您使用 On Error Goto 来防止空引用,则检查只是微不足道的。所以我建议不要考虑可见性,除非你正在对网页做一些事情并且需要维护空间和状态。
首先,创建一个 Windows 窗体并将其添加到您的项目中,假设这是您所描述的项目类型。使用适当的控件装饰表单,并在适用的情况下创建属性以允许公共访问控件值。还要设置“确定”或“取消”表单的按钮的 DialogResult 属性。给它一个适当的Fixed3D 或FixedDialog 边框样式。也许还可以为您希望表单在启动时出现的位置设置属性——中心父级、中心屏幕、Windows 默认值等。“OK”和“Cancel”的事件处理程序都应该调用 this.Close();关闭窗口。
从代码中的调用点来看,这里有一些假设的代码可以让您朝着正确的方向前进。在要调用对话框的地方写下类似的内容。
int intResult = 0;
string strResult = null;
MyDialogForm frm = new MyDialogForm();
frm.Title = "选择一个项目";
frm.SomeProperty = 0;
frm.SomeOtherProperty = true;
if (frm.ShowDialog() == DialogResult.OK)
{
intResult = frm.Result;
strResult = frm.StringResult;
}
else if (frm.ShowDialog() == DialogResult.Cancel)
{
// 用户点击了取消按钮。除了可能显示一条消息外,无事可做。
MessageBox.Show("取消的任务");
}
...
// 在更远的地方,但在范围内,只需重复
// 你刚刚做了什么,但不必重新实例化
// 窗体窗口。但是,如果您在同一个
中做到了那么远
// 作用域,这个方法可能太忙了,可能需要
// 考虑因素。
简而言之:
听起来不错?
【讨论】:
您可以将该控件放在面板中。当您不想显示控件时,设置面板高度 = 0 可见 = false。 当你想展示它时,反之亦然。
【讨论】:
派生自Control,而不是UserControl,并在构造函数集中Visible = false。
还要在构造函数中创建一个事件处理程序。
VisibleChanged += new EventHandler(SetVisibleFalse);
创建一个名为SetVisibleFalse的方法。
private void SetVisibleFalse(object sender, EventArgs e)
{
if (Visible) Visible = false;
}
【讨论】: