Tak to mniej więcej wygląda.

-
ModuleCollection to klasa zawierająca wszystkie obiekty ModuleElement, które służą do podstawowej obsługi modułów, czyli otwieranie, zamykanie, przesyłanie zdarzeń oraz komuniakcję między
modułami.
-
ModuleSelector to UserControl. Otrzymuje ona listę modułów z ModuleCollection i tworzy Buttony dzięki którym można otwierać/wybierać moduły.
-
Module1, Module2 to UserControls. jest to graficzne przedstawienie całego modułu.
-
ModuleViewer to UserControl. Służy on do wyświetlania Module1, Module2 itd. w zależności od tego, który aktualnie jest wybrany / otwarty. Otrzymuje on listę ModuleElement i przypisuje odpowiedni ModuleElement do odpowiedniej kontrolki
Interakcja między modułami wygląda następująco:
W kontrolce Module1 i Module2 mam stworzony obiekt ModuleElement, który reprezentuje jeden z obiektów ModuleElement z ModuleCollection.
- Załóżmy, że w module numer 2 wcisnąłem przycisk "uruchom moduł1".
- Wewnątrz każdego ModuleElement jest event, który przekazuje następujące argumenty:
Kopiuj
public Module_RequestActionEventArgs(eModule Source, eModule Target, eModuleRequest Question, object Data, bool RaiseEvent = true)
{
this.Source = Source;
this.Target = Target;
this.Question = Question;
this.Data = Data;
}
public eModule Source { get; private set; }
public eModule Target { get; private set; }
public eModuleRequest Question { get; private set; }
public object Data { get; private set; }
public bool RaiseEvent { get; set; }
}
Każdy z tych Eventów we wszystkich ModuleElement jest obserwowany przez metodę w ModuleCollection, która w zależności od właściwości "target" wysyła całe zapytanie do odpowiedniego modułu. Ale zaraz zaraz - ModuleElement został został utworzony w innym wątku i nie mam do niego dostępu ;__;

najlepsze jest to, że nawet użycie Dispatchera nie pomaga, dalej nie mam dostępu do wątku...
Problem rozwiązałem używając Dispatchera w innym miejscu, trochę nie po mojej myśli, bo zdarzenia nie miały mieć nic wspólnego z niczym poza ModuleElement no ale szkoda.
Eventy wysyłałem aż do MainWindow a potem on wysyłał je do ModuleCollector

Kopiuj
private void hModuleViewer_ModuleRequest(object sender, AllTypes.ModulePanel.Events.Module_RequestActionEventArgs e)
{
e.RaiseEvent = false;
switch (e.Question)
{
case eModuleRequest.Close:
Dispatcher.Invoke(() => Model.ModuleCollection.CloseModule(e.Target, e.Source, null));
break;
case eModuleRequest.Open:
Dispatcher.Invoke(() => Model.ModuleCollection.OpenModule(e.Target, e.Source, e.Data));
break;
case eModuleRequest.Reset:
Dispatcher.Invoke(() => Model.ModuleCollection.ResetModule(e.Target, e.Source, e.Data));
break;
case eModuleRequest.Select:
Dispatcher.Invoke(() => Model.ModuleCollection.SelectModule(e.Target, e.Source, e.Data));
break;
case eModuleRequest.SendData:
Dispatcher.Invoke(() => Model.ModuleCollection.SendModuleData(e.Target, e.Source, e.Data));
break;
case eModuleRequest.Unselect:
Dispatcher.Invoke(() => Model.ModuleCollection.UnselectModule(e.Target, e.Source, e.Data));
break;
}
}
grzesiek51114