2015-12-29 32 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

嗨,是的,我喜欢这样。很好很简单。谢谢 –