c# - 创建不可见的用户控件

时间:2010-05-05 16:19:48

标签: c# .net user-controls winforms

我需要在C#.Net中创建一个用户控件,可以将其添加到应用程序中而不会显示 - 就像FolderBrowserDialog一样。这是一个我将经常使用的新窗口,所以我认为这是正确的方法。通过从其他对话框中获知showDialog-Method来打开窗口。

任何想法? 谢谢和问候,

丹尼尔

7 个答案:

答案 0 :(得分:5)

由于所有这些“不可见”控件都派生自Component类,因此您应首先阅读其上的MSDN文章:http://msdn.microsoft.com/en-us/library/system.componentmodel.component.aspx

答案 1 :(得分:3)

只需将Visible设置为false,或者这不是您所要求的?

答案 2 :(得分:3)

根据定义,UserControl不是Form;我认为你真正想要的是Component。那就是说,你真的不能创建一个具有你想要的功能的新Form类吗?每当您想要显示它时,请创建一个新实例并调用ShowDialog。或者,如果要保留状态,请将实例作为类成员添加到父表单,每当要显示它时调用其Show方法,并将事件处理程序添加到其FormClosing事件中检查:

if (e.CloseReason == CloseReason.UserClosing)

,如果是的话,

e.Cancel = true;
Hide();

(最后一部分是为了防止用户关闭表单时出错,然后在处理完毕后再次尝试显示。)

答案 3 :(得分:0)

我认为可能需要更多信息,但如果您的自定义用户控件创建,则控件应具有.Visible属性。以下是一个示例,说明按钮如何在表单上定位但对用户隐藏。

button.Visible = true;  // shows the button
button.Show(); // Shows the button
button.Visible = false; // hides the button
button.Hide(); // Hides the button

虽然按钮可能仍在表单/控件上,但用户无法进行交互。您仍然可以对按钮执行编程控制,但实际上它不是用户控件,而是“隐藏”。如果你想要一个隐藏按钮,用户可以点击你需要做其他事情来获得这个,但它不应该是你想要的。

答案 4 :(得分:0)

这个显示/隐藏思维过程听起来很像经典VB中的痛苦和混乱。陈旧和隐藏等的旧形式方法令人困惑,并且经常让我作为开发者处于不知道对象是否存在或者仅仅是不可见的位置。如果您使用On Error Goto来阻止空引用,则检查只是微不足道的。所以,我建议不要考虑可见性,除非你正在做一些网页,需要保持空间和状态。

首先,创建一个Windows窗体并将其添加到项目中,假设这是您要描述的项目类型。使用适当的控件装饰表单,并在适用的情况下创建属性以允许公共访问控件值。还要设置“OK”或“取消”表单的按钮的DialogResult属性。给它一个适当的Border3D或FixedDialog边框样式。也许还设置了你希望表单在启动时出现的位置 - 中心父,中心屏幕,Windows默认等等。“OK”和“Cancel”的事件处理程序都应该调用this.Close();关上窗户。

从代码中的调用点开始,这里有一些假设的代码可以帮助您朝着正确的方向前进。在您想要调用Dialog的地方写下这样的内容。

int intResult = 0;
string strResult = null;

MyDialogForm frm = new MyDialogForm();
frm.Title = "Select an Item";
frm.SomeProperty = 0;
frm.SomeOtherProperty = true;
if (frm.ShowDialog() == DialogResult.OK)
{
intResult = frm.Result;
strResult = frm.StringResult;
}
else if (frm.ShowDialog() == DialogResult.Cancel)
{
// User clicked the cancel button. Nothing to do except maybe display a message.
MessageBox.Show("Canceled Task");
}

...

// Somewhere further on down, but within scope, simply repeat
// what you just did, but without having to reinstantiate the
// form Window. But if you make it that far within the same
// scope, this method might be too busy and may need to be
// factored down.

简而言之:

  • 报废/隐藏 - 它不是一件好事 实践。
  • 不使用保存表单数据 用一种不可见的形式来保存它; 这是班级的工作。
  • 如果用户界面需要大量翻转而且 在窗户之间,检查你的 设计其他替代品 解决原始问题。也许像MVC这样的设计模式适合您,具体取决于应用程序的大小和复杂程度。

听起来不错?

答案 5 :(得分:0)

您可以将该控件放在Panel中。当您不想显示控件时,设置面板高度= 0 visible = false。 当你想要展示它时,反之亦然。

答案 6 :(得分:0)

Control而不是UserControl派生,并在构造函数中设置Visible = false

还要在构造函数中创建一个事件处理程序。

VisibleChanged += new EventHandler(SetVisibleFalse);

创建一个名为SetVisibleFalse的方法。

private void SetVisibleFalse(object sender, EventArgs e)
{
    if (Visible) Visible = false;
}