2015-08-27 12 views
6

Attualmente sto sviluppando un'applicazione UWP che coinvolge diversi oggetti Usercontrol all'interno di una mappa (utilizzando Windows.UI.Xaml.Navigation).UWP Accesso al frame per la navigazione della pagina tramite Usercontrol a Object?

con questi oggetti di Usercontrol A volte ho bisogno che l'utente sia in grado di premere un pulsante negli oggetti e di essere portato su una nuova pagina, l'unico problema è che non riesco ad accedere al Frame della pagina per poter usare il

Frame.Navigate(typeof([page])); 

metodo. Come andrei su questo e/o ci sono delle alternative? Sono rimasto bloccato per gran parte della giornata!

Grazie in anticipo per qualsiasi aiuto che voi ragazzi potete offrire!

risposta

7

Possiamo permettere alla pagina di navigare da solo. Basta definire un evento nel tuo usercontrol personalizzato e ascoltare l'evento nel suo genitore (la pagina).

Prendiamo il seguente come esempio:

  1. Creare un controllo utente personalizzato e mettere un pulsante su di esso a scopo di test.
  2. In evento clic del pulsante di test, aumentare l'evento per spostarsi nella pagina padre.
  3. Nella pagina padre, ascoltare l'evento UserControl e chiamare Frame.Navigate.

di MyControl Xaml: CodeBehind

<UserControl 
x:Class="App6.MyControl" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:local="using:App6" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
mc:Ignorable="d" 
d:DesignHeight="300" 
d:DesignWidth="400"> 

<Grid> 
    <Button x:Name="testbtn" Margin="168,134,0,134" Click="testbtn_Click">test</Button> 
</Grid> 
</UserControl> 

di MyControl:

public sealed partial class MyControl : UserControl 
{ 

    public delegate void MyEventHandler(object source, EventArgs e); 

    public event MyEventHandler OnNavigateParentReady; 

    public MyControl() 
    { 
     this.InitializeComponent(); 
    } 

    private void testbtn_Click(object sender, RoutedEventArgs e) 
    { 
     OnNavigateParentReady(this, null); 
    } 


} 

Naviga MainPage a SecondaPagina:

public MainPage() 
    { 
     this.InitializeComponent(); 

     myControl.OnNavigateParentReady += myControl_OnNavigateParentReady; 
    } 

    private void MyControl_OnNavigateParentReady(object source, EventArgs e) 
    { 
     Frame.Navigate(typeof(SecondPage)); 
    } 
+0

Fantastico! Grazie per questo. Ha funzionato come un fascino. – kgyts

+0

Ottiene un nullpointer su 'OnNavigateParentReady (this, null);'? – Evilunclebill

+1

Avevo bisogno di cambiare 'evento pubblico' in' evento statico pubblico', in modo da poter usare questa soluzione in un 'UserControl' all'interno di un' DataTemplate' all'interno di un 'GridView.ItemTemplate' all'interno di un' GridView' all'interno di una 'Grid'' all'interno di un 'Page' ... Grazie per un'ottima soluzione. – dav1dsm1th

0

Si potrebbe ottenere un riferimento al Telaio dalla finestra attuali Soddisfare. nel codice di controllo utente dietro prova:

Frame navigationFrame = Window.Current.Content as Frame; 
navigationFrame.Navigate(typeof([page])); 
0

Oppure, con Fusioni =>

((Frame) Window.Current.Content) .Navigate (typeof (Views.SecondPage));