我是c#的新手,並且無法在聲明變量時發現問題。將變量或引用設置爲已打開的表格
我有一個我已經發送給後臺工作者的lengthprocess。在長度過程完成它的事情的同時,表單顯示告訴用戶等待。當lengthprocess完成後,我想等待窗體關閉。
如何引用已經存在的等待表單實例,以便我可以在後臺工作人員的關閉過程中關閉它?關閉過程與等待表單打開的過程有不同的私有空間,我似乎無法在私有空白之外聲明該表單。
任何幫助將不勝感激。
謝謝...
我是c#的新手,並且無法在聲明變量時發現問題。將變量或引用設置爲已打開的表格
我有一個我已經發送給後臺工作者的lengthprocess。在長度過程完成它的事情的同時,表單顯示告訴用戶等待。當lengthprocess完成後,我想等待窗體關閉。
如何引用已經存在的等待表單實例,以便我可以在後臺工作人員的關閉過程中關閉它?關閉過程與等待表單打開的過程有不同的私有空間,我似乎無法在私有空白之外聲明該表單。
任何幫助將不勝感激。
謝謝...
您希望您的回調擊出了一些代碼,「調用」你的用戶界面的變化。
C# How does a background thread tell a UI thread that it has finished doing something?
聲明的形式在課堂上,但出來的方法:
Form2 frm2 = new Form2();
但顯示它在需要時:(-in的方法)
frm2.Show();
(我的回答我現在注意到你指的是wpf,我不知道它是否工作相同。)
這正是我想在wpf中做的一點。 – sotiris 2012-01-09 20:11:05
看看BackgroundWorker
和how to use it。有您感興趣的所有信息。
runworkercompleted句柄已經建立並正在工作,我想引用已經打開的waitform,以便我可以關閉它。我不確定如何設置這個參考,因爲我們以另一種類型打開等待表單。 – sotiris 2012-01-09 20:10:21
如果您的意思是.NET中的BackgroundWorker類,它有一個RunWorkerCompleted事件。只需註冊一個事件處理程序即可關閉表單。
編輯
最好的辦法是閱讀MSDN documentation for BackgroundWorker。請注意,提供了2個示例,第二個示例更好,因爲第一個示例沒有提供有助於理解的事件註冊碼。 AND頁面底部的方式是評論者提供的很好的示例(BGW細微差別,包括SampleBand ProgressBar)。
也許這個綱要是有幫助的:
可以,做可能是這樣的,如果我正確理解你的意圖:
public class FormWait
{
private static FormWait frm = new FormWait();
public static void ShowForm(string message)
{
Show(message);
}
public static void Close()
{
Application.Current.Dispatcher.Invoke(new Action(() =>
{
if(!frm.Visible)
return;
frm .Close();
}));
}
private void Show(string str)
{
Application.Current.Dispatcher.Invoke(new Action(() =>
{
if(frm.Visible)
frm.Close();
lblMessage.Text = message; // assume that there is a label on the Form to show the message
frm .Show();
}));
}
}
只是一個想法。
你沒有發佈你的等待表單的代碼,所以我有種猜測。簡而言之,您需要在課堂級別的一個私有變量來關閉。這是測試代碼。
public partial class MainWindow : Window
{
NavigationWindow winWait;
public MainWindow()
{
InitializeComponent();
}
private void btnShow(object sender, RoutedEventArgs e)
{
if (winWait != null) return;
winWait = new NavigationWindow();
winWait.Content = new PageWait();
winWait.Show();
}
private void btnHide(object sender, RoutedEventArgs e)
{
if (winWait != null) winWait.Close();
}
}
如果你想要有多個「等待」的形式,那麼你需要一個小鴿友。您不需要在該類上使用Navigation變量,而是創建它並將其傳遞給後臺,以便將其傳回給回調。你需要處理!= null但不活躍。
對於那些可能關注:
使用BalamBalam的非常有用的代碼我設法得到如下這樣工作:
class DatabaseUpdater
{
// Declare the background worker and WaitForm at Class Level
static BackgroundWorker bw;
public static Form WaitForm;
public static void DelegateWorkStuff()
{
// Set up the background process and show WaitForm in here
bw = new BackgroundWorker();
bw.WorkerReportsProgress = true;
WaitForm = new WaitForm();
WaitForm.Show();
bw.DoWork += bw_DoWork;
bw.ProgressChanged += bw_ProgressChanged;
bw.RunWorkerCompleted += bw_RunWorkerCompleted;
bw.RunWorkerAsync();
}
static void bw_DoWork(object sender, DoWorkEventArgs e)
{
//Run the lenghty code/processes in here
}
static void bw_RunWorkerCompleted (object sender, RunWorkerCompletedEventArgs e)
{
//Close the Waitform thus
WaitForm.Close();
}
私人無效是一個範圍和類型(或缺乏存在的)。你的意思是在2個不同的班級?你能提供一些代碼來澄清? – 2012-01-09 19:36:35
嗨,傑夫,謝謝你的迴應,我剛從下班回家,明天就不得不張貼代碼。 – sotiris 2012-01-09 20:07:08
在你的課程級別你只需聲明變量。 – Paparazzi 2012-01-09 20:20:17