2014-07-11 15 views
8

Sono nuovo in Caliburn Micro e lo imparo dal this helloworld example. Nell'esempio ci sono solo 2 viste (.xaml) di tipo Application e UserControl e 1 view model.WPF + Caliburn Micro: come catturare l'evento Chiudi finestra?

Evito di utilizzare il codice dietro. Pertanto ho solo visualizzare e visualizzare il modello. Voglio sapere come catturare l'evento di chiusura della finestra della mia applicazione helloworld così posso gestirlo nel modello di visualizzazione. Il mio obiettivo: quando l'utente chiude l'app premendo il pulsante Chiudi [x] nell'angolo in alto a destra, l'app fornisce un feedback all'utente.
Ho letto su IViewAware e IScreen, ma non trovo esempi specifici relativi alla mia domanda.

Un codice di esempio semplice per il modello di visualizzazione e visualizzazione è molto apprezzato. Grazie in anticipo.

PS. Io uso VS2013, C#.

risposta

8

Che cosa si può fare è nel vostro View è possibile allegare Caliburn Micro utilizzando

cal:Message.Attach="[Event Closing] = [Action OnClose($eventArgs)]" 

Così sarà simile

<Window cal:Message.Attach="[Event Closing] = [Action OnClose($eventArgs)]"> 

E sul ViewModel si può solo definire un metodo pubblico che dice OnClose con CancelEventArgs come parametro e puoi gestirlo da lì.

+0

Non ho la vista del tipo Finestra. Le mie viste ha solo digitare Application e UserControl. Se uso la tua dichiarazione in UserControl ottengo errore: Il nome "Messaggio" non esiste nello spazio dei nomi "clr-namespace: Caliburn.Micro; assembly = Caliburn.Micro" – MagB

+0

Ho scoperto, ho bisogno di usare Caliburn.Micro. Piattaforma – MagB

+0

Bene, UserControl non ha evento di chiusura. Sembra che io debba avere una vista di tipo Window o che abbia bisogno di un ShellView. – MagB

1

Stai cercando un modo per associare un evento a un comando. L'approccio tipico qui è quello di utilizzare il comportamento EventToCommand da MVVMLight.

Esempio di utilizzo (dal articolo collegato):

<StackPanel Background="Transparent"> 
    <i:Interaction.Triggers> 
    <i:EventTrigger EventName="Tap"> 
     <command:EventToCommand 
     Command="{Binding Main.NavigateToArticleCommand, 
      Mode=OneWay, 
      Source={StaticResource Locator}}" 
     CommandParameter="{Binding Mode=OneWay}" /> 
    </i:EventTrigger> 
    </i:Interaction.Triggers> 
    <!--...--> 
</StackPanel> 

per lo scenario specifico, non si utilizza MVVMLight. Poiché tale framework è open source, è possibile copiare l'implementazione di EventToCommand nel proprio progetto o, più semplicemente, è possibile utilizzare lo InvokeCommandAction, che fa parte della libreria System.Windows.Interactivity.dll, inclusa in Expression Blend.

Esempio di InvokeCommandAction:

<TextBox x:Name="TicketNumber"> 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="KeyDown"> 
      <i:InvokeCommandAction Command="{Binding OpenTicketCommand}" /> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
</TextBox> 

Infine, tutto questo dogma MVVM che "non si può avere alcun codice dietro" è stato abbattuto time | and | time di nuovo (l'ultimo collegamento è particolarmente rilevante). MVVM dovrebbe essere unit-testabile e separa la "logica di visualizzazione" dalla "logica aziendale". L'evento "Chiudi" è un po 'un'area grigia tra la logica di visualizzazione e di business. Ma se riesci a scrivere un gestore di eventi nel tuo codice, che invoca il metodo o il comando appropriato di ViewModel, e se puoi testare il codice unitamente, allora sei buono quanto l'oro. Non preoccuparti di rimuovere tutte le tracce di code-behind dal tuo progetto.

+0

Grazie per la risposta rapida, ma al momento non utilizzo MVVM Light. Sono sicuro che il caliburn micro ha un modo diverso, probabilmente un modo più semplice. PS. Ho usato MVVM Light in precedenza. – MagB

+0

Buon punto - Ho aggiornato la risposta con alcune alternative. – BTownTKD

2

Se il ViewModel eredita schermo, Caliburn Micro ha alcuni metodi che è possibile eseguire l'override come

protected override void OnDeactivate(bool close); 

questo viene chiamato quando una schermata è chiuso o disattivato o

public override void CanClose(Action<bool> callback) 

è possibile controllare l'utilizzo CanClose here

+0

Che non ti dia la possibilità di annullare la chiusura della finestra soprattutto con i tasti 508 che lo chiudono –

+0

@lll Non so cosa intendi, CanClose può annullare la chiusura di una finestra quando si preme la x rossa o quando si fa Alt + F4. L'ho appena provato – gcores

+0

@gcores come appare la vista (xaml)? – MagB