调用一组属性更改的更好方法

时间:2015-12-29 12:52:32

标签: c# wpf invoke

我有一个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;      
}

然后如果我在任何地方都这样做,我将需要基本上创建'阴影'功能。

我可以使用更好的设计模式吗?

附加: 带扩展名的代码示例(给出错误:

没有任何参数对应于'InvokeOnMainThread(Control,Action)'所需的形式参数'method'

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

2 个答案:

答案 0 :(得分:1)

此模式有效:

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

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

如果您的方法接受参数,则将lambda传递给BeginInvoke而不是方法组。

答案 1 :(得分: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);