2015-12-29 6 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;   
    } 
} 

Этот код в основном говорят чек, если «Invoke» требуется (потому что в другом потоке), и если так использовать подходящий способ, чтобы скрыть 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 (контроль, действие)»

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

Если ваш метод принимает аргументы, передать лямбда-BeginInvoke крысы ей, чем группе методов.

+0

привет, да мне это нравится. Ницца и просто. спасибо –