2015-12-29 33 views
0

我有一個wpf c#應用程序。調用一組屬性更改的更好方法

我會像這樣的功能:

private void ReSetScreen() 
{ 
    if (!Dispatcher.CheckAccess()) 
    { 
     Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() => 
     { 
      ucCustomerNew.Visibility = Visibility.Hidden; 
      ucCustomerResults.Visibility = Visibility.Hidden;    
     })); 
    } 
    else 
    { 
     ucCustomerNew.Visibility = Visibility.Hidden; 
     ucCustomerResults.Visibility = Visibility.Hidden;   
    } 
} 

是否需要「調用」(因爲在不同的線程)這段代碼基本上是說檢查,如果是使用適當的方法來隱藏2個用戶控件我創造了。

我在我的應用程序中有很多這樣的代碼段。

我可以重構上面:

private void ReSetScreen() 
{ 
    if (!Dispatcher.CheckAccess()) 
    { 
     Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() => 
     { 
      DoMystuff()    
     })); 
    } 
    else 
    { 
     DoMystuff() 
    } 
} 

void DoMystuff() 
{ 
    ucCustomerNew.Visibility = Visibility.Hidden; 
    ucCustomerResults.Visibility = Visibility.Hidden;  
} 

,然後,如果我這樣做了,我到處都需要我會基本上創建「影子」的功能。

有沒有更好的設計模式,我可以使用呢?

ADDITIONAL: 與延伸(其產生了錯誤的代碼示例:

沒有給定的參數對應於所要求的形式參數「方法」「InvokeOnMainThread(控制,動作)」

public partial class MainWindow : Window 
{ 
    private void ReSetScreen() 
    { 
     WorkingClasses.Shared.InvokeOnMainThread(() => { ucCustomerNew.Visibility = Visibility.Hidden; ucCustomerResults.Visibility = Visibility.Hidden; }); 
    } 

public static class Shared 
{ 
    public static void InvokeOnMainThread(this Control control, Action method) 
    { 
     //if (method == null) throw new ArgumentNullException("method"); 
     if (!control.Dispatcher.CheckAccess()) 
     { 
      Application.Current.Dispatcher.BeginInvoke(method); 
      return; 
     } 

     method(); 
    } 
} 
+1

您可以創建一個以'Action'作爲參數的單個幫助器方法。就模式而言,這將被稱爲「高階函數」。 –

+0

@PieterWitvoet re:作爲參數的行動 - 我想我知道你的意思。你會有一個代碼示例來發布我接受嗎? –

回答

1
public static class ControExtensions 
    { 
    public static void InvokeOnMainThread(this Control control, Action method) 
    { 
     if (method == null) throw new ArgumentNullException("method"); 
     if (!control.Dispatcher.CheckAccess()) { 
     Application.Current.Dispatcher.BeginInvoke(method); 
     return; 
     } 

     method(); 
    } 
    } 

將該擴展插入WPF實用程序項目中,以便您可以重用它。 使用它非常簡單:

this.InvokeOnMainThread(this.DoMyStuff); 
+0

謝謝你的回答。我不確定我現在更喜歡哪一個。我會玩弄它。謝謝 –

+0

這是一個編譯錯誤或異常? –

+0

這應該工作:InvokeOnMainThread(()=> { ucCustomerNew.Visibility = Visibility.Hidden; ucCustomerResults.Visibility = Visibility.Hidden; }); –

1

這種模式的工作原理:

private void ReSetScreen() 
{ 
    if (!Dispatcher.CheckAccess()) 
    { 
     Application.Current.Dispatcher.BeginInvoke(ReSetScreen); 
     return; 
    } 

    ucCustomerNew.Visibility = Visibility.Hidden; 
    ucCustomerResults.Visibility = Visibility.Hidden;   
} 

如果你的方法需要的參數,傳遞一個lambda來BeginInvoke鼠她比方法組。

+0

嗨,是的,我喜歡這樣。很好很簡單。謝謝 –