2012-02-13 111 views
3

想從在WPF BackgroundWorker的讀取複選框的值:閱讀複選框狀態

這不起作用:

bool? isSleepChecked = checkBoxSleep.Dispatcher.Invoke(DispatcherPriority.Normal, (ThreadStart)delegate{ return checkBoxSleep.IsChecked;}); 

無法轉換匿名方法委託型「系統.Threading.ThreadStart',因爲塊中的一些返回類型不能隱式轉換爲委託返回類型

編輯 - 這裏是HB的答案,表示使用委託而不是lambda,我發現它的可讀性略高

bool? isSleepChecked = (bool?)checkBoxSleep.Dispatcher.Invoke(new Func<bool?>(delegate { return checkBoxSleep.IsChecked; })); 

回答

6

分配變量,而不是,那麼你並不需要一個return

bool? isSleepChecked; 
checkBoxSleep.Dispatcher.Invoke(new Action(
    () => isSleepChecked = checkBoxSleep.IsChecked)); 

另外,您可以使用帶有返回值的委託(如Func<T>):

bool? isSleepChecked = checkBoxSleep.Dispatcher.Invoke(new Func<bool?>(
          () => checkBoxSleep.IsChecked)); 

(需要返回類型轉換之前.NET 4.5)

+0

感謝HB(和道格拉斯太)。非常相似的答案。我似乎更喜歡Func的答案..並有一個錯字..應該是:新功能 2012-02-13 20:29:29

+0

@DaveMateer:正要解決這個問題:) – 2012-02-13 20:31:57

+0

乾杯 - 放在上面的代表版本。 – 2012-02-13 20:47:02

2

您的代碼不會因爲編譯,而你正試圖從你的委託返回bool?ThreadStartvoid返回類型。

在這種情況下,最簡單的方法很可能將是一個lambda表達式中捕捉isSleepChecked變量,直接設置它:

bool? isSleepChecked = null; 
checkBoxSleep.Dispatcher.Invoke(new Action(() => 
{ 
    isSleepChecked = checkBoxSleep.IsChecked; 
}), 
    DispatcherPriority.Normal);