簡體   English   中英

c# - 創建不可見的用戶控件

[英]c# - create invisible user control

我需要在C#.Net中創建一個用戶控件,可以將其添加到應用程序中而不會顯示 - 就像FolderBrowserDialog一樣。 這是一個我將經常使用的新窗口,所以我認為這是正確的方法。 通過從其他對話框中獲取showvialog-Method來打開窗口。

任何想法? 謝謝並恭祝安康,

丹尼爾

由於所有這些“不可見”控件都派生自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窗體並將其添加到您的項目中,假設這是您正在描述的項目類型。 使用適當的控件裝飾表單,並在適用的情況下創建屬性以允許公共訪問控件值。 還要設置“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");
}
...

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.

簡而言之:

  • 廢料展示/隱藏 - 這不是一個好習慣。
  • 保存表單數據而不使用不可見的表單來保存它; 這是班級的工作。
  • 如果UI需要在窗口之間來回翻轉,請檢查您的設計是否有其他替代方案來解決原始問題。 也許MVC等設計模式適合您,具體取決於應用程序的大小和復雜程度。

聽起來不錯?

您可以將該控件放在Panel中。 當您不想顯示控件時,設置面板高度= 0 visible = false。 當你想要展示它時,反之亦然。

派生自Control ,而不是UserControl ,並在構造函數集Visible = false派生。

還要在構造函數中創建一個事件處理程序。

VisibleChanged += new EventHandler(SetVisibleFalse);

創建名為SetVisibleFalse的方法。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM