2012-01-09 43 views
0

我是c#的新手,並且無法在聲明變量時發現問題。將變量或引用設置爲已打開的表格

我有一個我已經發送給後臺工作者的lengthprocess。在長度過程完成它的事情的同時,表單顯示告訴用戶等待。當lengthprocess完成後,我想等待窗體關閉。

如何引用已經存在的等待表單實例,以便我可以在後臺工作人員的關閉過程中關閉它?關閉過程與等待表單打開的過程有不同的私有空間,我似乎無法在私有空白之外聲明該表單。

任何幫助將不勝感激。

謝謝...

+0

私人無效是一個範圍和類型(或缺乏存在的)。你的意思是在2個不同的班級?你能提供一些代碼來澄清? – 2012-01-09 19:36:35

+0

嗨,傑夫,謝謝你的迴應,我剛從下班回家,明天就不得不張貼代碼。 – sotiris 2012-01-09 20:07:08

+0

在你的課程級別你只需聲明變量。 – Paparazzi 2012-01-09 20:20:17

回答

0

聲明的形式在課堂上,但出來的方法:

Form2 frm2 = new Form2(); 

但顯示它在需要時:(-in的方法)

frm2.Show(); 

(我的回答我現在注意到你指的是wpf,我不知道它是否工作相同。)

+0

這正是我想在wpf中做的一點。 – sotiris 2012-01-09 20:11:05

0

看看BackgroundWorkerhow to use it。有您感興趣的所有信息。

+0

runworkercompleted句柄已經建立並正在工作,我想引用已經打開的waitform,以便我可以關閉它。我不確定如何設置這個參考,因爲我們以另一種類型打開等待表單。 – sotiris 2012-01-09 20:10:21

1

如果您的意思是.NET中的BackgroundWorker類,它有一個RunWorkerCompleted事件。只需註冊一個事件處理程序即可關閉表單。

編輯

最好的辦法是閱讀MSDN documentation for BackgroundWorker。請注意,提供了2個示例,第二個示例更好,因爲第一個示例沒有提供有助於理解的事件註冊碼。 AND頁面底部的方式是評論者提供的很好的示例(BGW細微差別,包括SampleBand ProgressBar)。

也許這個綱要是有幫助的:

  1. 你MainForm中實例化一個WaitForm(一ProgressBar?)
  2. 你MainForm中實例化一個BackgroundWorker
  3. 你的MainForm有BackgroundWorker的進度和適當事件的事件處理程序。
  4. ProgressBar不必顯式關閉。
+0

runworkercompleted句柄已經建立並正在工作,在那裏我想引用已經打開的waitform,以便我可以關閉它。我不確定如何設置這個參考,因爲我們以另一種類型打開等待表單。 – sotiris 2012-01-09 20:09:55

+0

但RunWorkerComplete如何獲得對該表單的引用? – Paparazzi 2012-01-09 20:17:36

0

可以,做可能是這樣的,如果我正確理解你的意圖:

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(); 
      })); 


    } 

    } 

只是一個想法。

0

你沒有發佈你的等待表單的代碼,所以我有種猜測。簡而言之,您需要在課堂級別的一個私有變量來關閉。這是測試代碼。

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但不活躍。

0

對於那些可能關注:

使用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(); 
    }