2013-07-09 15 views
12

Mi chiedevo come si potesse accedere all'istanza corrente della pagina principale da una classe diversa in un'app di Windows Store C#.Il modo migliore per accedere all'istanza corrente di MainPage in un'app di Windows Store?

In particolare, in un'app di Windows Store per un tablet Surface RT (quindi, limitato all'API RT), desidero accedere ai metodi mainpage e agli elementi dell'interfaccia utente di altre classi.

Creazione di una nuova istanza funziona, in questo modo:

MainPage mp = new MainPage(); 
mp.PublicMainPageMethod(); 
mp.mainpageTextBlock.Text = "Setting text at runtime"; 

in quanto espone gli elementi metodi/UI, ma questo non può essere la procedura corretta.

Qual è la procedura migliore per accedere ai metodi e modificare gli elementi dell'interfaccia utente nella pagina principale in fase di runtime, da altre classi? Ci sono diversi articoli su questo per Windows Phone ma non riesco a trovare nulla per Windows RT.

+1

direi migliore pratica non è di farlo . La migliore pratica sarebbe quella di utilizzare un modello come MVVM che mantiene le cose che potresti voler richiamare dall'interfaccia utente. http://en.wikipedia.org/wiki/Model_View_ViewModel – dkackman

+1

Concordo con l'utilizzo del pattern MVVM. Per lo meno, potresti creare eventi nelle classi che altrimenti aggiornerebbero il tuo modulo principale. Chiedi al tuo modulo principale di sottoscrivere questi eventi e consenti di gestire la propria interfaccia utente in risposta agli eventi. –

risposta

2

Se stai utilizzando MVVM, puoi utilizzare la classe Messenger:

MainWindow.xaml:

using GalaSoft.MvvmLight.Messaging; 

public MainWindow() 
{ 
    InitializeComponent(); 
    this.DataContext = new MainViewModel(); 
    Messenger.Default.Register<NotificationMessage>(this, (nm) => 
    { 
     //Check which message you've sent 
     if (nm.Notification == "CloseWindowsBoundToMe") 
     { 
      //If the DataContext is the same ViewModel where you've called the Messenger 
      if (nm.Sender == this.DataContext) 
       //Do something here, for example call a function. I'm closing the view: 
       this.Close(); 
     } 
    }); 
} 

E nel vostro ViewModel, è possibile chiamare il Messenger o avvisare il View qualsiasi momento:

Messenger.Default.Send<NotificationMessage>(new NotificationMessage(this, "CloseWindowsBoundToMe")); 

abbastanza facile ... :)

-1

Preferisco un delegato/evento, in questo modo non hai accesso diretto alla classe.

public MainWindow() 
{ 
    StartWindowUserControl.newBla += StartWindowUserControl_newBla; 

    private void StartWindowUserControl_newBla() 
    { 

e

public partial class StartWindowUserControl : UserControl 
{ 
    public delegate void newBlaDelegate(); 
    public static event newBlaDelegate newBla; 

MethodA() 
{ 
    new(); 
+0

Perché creare un nuovo delegato? Basta usare 'Azione'. Inoltre, non puoi nominare un'azione 'new' come' new' è una parola chiave. – Servy

+0

appena preso qualcosa dal mio codice e cancellato le parti successive, sì nuovo è vietato, dimenticato che quando si elimina ^^ e perché non utilizzare nuovi delegati? Penso che sia una questione di gusti – Master117

+1

Quando vedo un evento di tipo "Azione", so immediatamente qual è la firma. È un metodo 'void' senza parametri. Quando vedo un evento di tipo 'newBlaDelegate' non ho idea di cosa sia la firma; Devo andare a cercarlo. Inoltre, l'uso di 'Action' /' Func', quando possibile, semplifica il passaggio dei delegati piuttosto liberamente e li usa in modo intercambiabile se hanno la firma giusta, piuttosto che preoccuparsi della conversione da un delegato a un altro quando le firme corrispondono perfettamente. – Servy

32

Sono d'accordo che è meglio usare modello MVVM, ma solo nel caso in cui è necessario ottenere pagina corrente lo si può fare come segue:

var frame = (Frame)Window.Current.Content; 
    var page = (MainPage)frame.Content; 
+4

Santo dio come mi sono chiesto come fare questo. Lei signore, sono un campione e un gentiluomo. Molte grazie. – MartinJH

Problemi correlati