2012-09-26 72 views
0

我有一個工具提示按鈕的應用程序。按下其中一個按鈕(此後稱爲「運行」按鈕)會在應用程序按下時開始執行觸發過程。因爲我的應用程序需要從這些進程中獲取輸出的數據,所以我暫停了,直到所有進程完成運行,然後在沒有進一步用戶干預的情況下獲取數據。當然,這意味着我的應用程序在外部進程運行時被掛起,但這沒什麼大不了的,因爲用戶可以在應用程序之外點擊並處理其他內容;我的應用程序落到了後臺。不幸的是,與「運行」按鈕關聯的工具提示不屬於背景,直到我的代碼停止執行後纔會消失。如何讓System.Windows.Controls.Tooltip立即淡出?

下面的代碼有所幫助:

private void RunButton_Click(object sender, RoutedEventArgs e) 
{ 
    /*Gets the tooltip out of the way while running, otherwise it will stay in front of everything until the optimizers finish.*/ 
    ToolTipService.SetShowDuration(runButton, 0); 
    RunTooltip.IsOpen = false;//Doesn't close fast enough. It fades a little then hangs there until the code stop running. googling has been remarkably unhelpful. 
    Run(); 
    ToolTipService.SetShowDuration(runButton, 5000); 
} 

RunTooltip是有問題的工具提示的名稱。將持續時間設置爲0或設置isOpen爲false具有相同的行爲:導致工具提示變爲半透明(但仍然高於其他任何窗口),直到Run()結束。

似乎有一種方法可以使工具提示淡出與Windows.Forms.Tooltips立即發生(請參閱http://msdn.microsoft.com/en-us/library/system.windows.forms.tooltip.usefading.aspx),但WPF工具提示不再是這種情況(http://msdn.microsoft.com/ en-us/library/ms617634.aspx)

除了完全刪除此按鈕的工具提示外,如何讓此工具提示免於阻礙用戶在等待我的應用程序完成時想要執行的操作? 謝謝

+2

您的問題是由於線程引起的。將您的運行操作移動到新線程中。這將允許執行Run操作,同時仍允許主線程運行並關閉工具提示。您仍然可以鎖定應用程序啓用/禁用/隱藏/可見,以停止用戶輸入...編輯是由於我有一個老年時刻... – Sorceri

回答

0

您可能會更改OnClicked事件中ToolTip的Popup組件的可見性,但您必須使用VisualTreeHelper來查找ToolTip,並且它有點麻煩。用戶界面仍然會被凍結,但這不是最好的方式。

以下是一條經驗法則:如果您凍結了用戶界面,那麼您做錯了。

您可能需要一個繁忙的指標來包裝您的控件(在codeplex上的WPF工具包中有一個很棒的指標)。 WPF效果最好(即最乾淨)使用MVVM模式,但如果你在代碼隱藏,像這樣直接的工作:

void MyButton_Click(object sender, EventArgs e) 
{ 
    var backgroundThread = new Thread(DoWork); 
    this.MyBusyIndicator.IsBusy = true; 
    backgroundThread.Start(); 
} 

然後工作完成後,將BusyIndi​​cator控件不再忙碌。

1

可以使用BackgroundWorker,然後在CallBack上加載UI。

BackgroundWorker Class

如果您要舉報的Y進步鏈接過程X可以通過用戶ReportsProgress。你可以取消。

0

糾正我,如果我錯了,因爲我可能會誤解你,但它聽起來像你在處理UI的線程中執行某種計算上昂貴的東西。一個簡單的解決這個問題可能是創建一個工作線程像這樣:

private void button1_Click(object sender, EventArgs e) 
    { 
     Thread workerThread = new Thread(ExpensiveMethod); 
     btnShow.Visible = false; 
     workerThread.Start(); 
    } 

    private void ExpensiveMethod() 
    { 
     for (int i = 0; i < int.MaxValue; i++) 
     { 

     } 

     btnShow.Visible = true; 
    } 

這意味着在計算昂貴的東西正在被處理的線程處理的UI(因此提示)可以正常進行工作者線程。

如果我誤解了你,請告訴我!

+1

缺少「然後抓住數據」部分。 – Paparazzi

+0

該死的,對嗎?那麼後臺工作者就是這樣。 –